我碰巧浏览了 .net 框架源代码,并且碰巧在 Nullable 结构实现的显式运算符实现中运行。下面的屏幕截图显示了 Value 属性的实现以及显式运算符的实现。我也明白显式运算符正试图从 Nullable 转换为 T。我的问题是为什么不是下面的代码没有引发异常
框架实现
public T Value {
get {
if (!HasValue) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
}
return value;
}
}
public static explicit operator T(Nullable<T> value) {
return value.Value;
}
客户代码
int? i = null;
int? i2 = (int?)i; //No Error
int? i = null;
int i2 = (int)i; //Runtime error
它说 value.Value ,理想情况下,由于 HasValue 将为 false(因为我分配了 null),它应该抛出无效的操作异常,但它很乐意将值分配给 i2。但是,如果我们将其更改为 (int)i 而不是 (int?)i,则会引发来自 Value 属性的 InvalidOperatorException。我的想法是当 value.Value 被调用时,它会抛出一个异常,因为该属性正在被访问并且它会完成它的工作。
请在同一方面澄清
谢谢,
西帕文