C# - 使用checked/unchecked运算符进行自定义显式转换

Web*_*euw 5 c#

我正在学习用C#编写自定义类型转换,我有一个问题,我无法通过Google/MSDN /早期发布的SO项目解决.

通常,缩小数字类型的C#程序通过未经检查的显式转换来执行此操作,例如:

int i = 256;
byte b = (byte)i; // b == 0
Run Code Online (Sandbox Code Playgroud)

但是,以下将给出溢出异常:

byte b = checked((byte)i);
Run Code Online (Sandbox Code Playgroud)

我的问题如下:在自定义类型转换中可实现的checked/unchecked关键字的行为,例如:

class Foo {
  public static explicit operator int(Foo bar) {
    if (checked)
      throw someEception
    else
      return some Foo to int conversion
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,上面的代码不是答案,但有人知道这样的事情是否可行?

Meh*_*ari 6

checked是一个编译时间的事情.也就是说,它的唯一影响将是直接checked语句包围的代码块,而不是该块中调用的方法.因此,在运行时不会有一个checkedunchecked上下文,您可能希望根据它调整函数的行为.


Wim*_*nen 5

C#语言规范的第14.5.12节明确枚举了已检查和未检查的关键字可以生效的所有运算符.

用户定义的运算符不是该列表的一部分,因此不能编写用户定义的转换运算符,该运算符将已选中/取消选中.