我刚好浏览了 .net framework 源代码,并发现了 Nullable 结构实现的显式运算符。下面的截图显示了 Value 属性的实现以及显式运算符的实现。我也知道显式运算符试图将 Nullable 转换为 T。我的问题是为什么以下代码没有抛出异常。
框架实现
自定义代码
它说 value.Value,理想情况下 HasValue 应该为 false(因为我分配了 null),它应该抛出无效操作异常,但它却愉快地将值分配给了 i2。然而,如果我们将其更改为 (int)i 而不是 (int?)i,则会引发来自 Value 属性的 InvalidOperatorException。我的想法是当调用 value.Value 时,它会抛出异常,因为正在访问该属性并且它将执行其工作。
请澄清一下。
谢谢,
Sai Pavan
框架实现
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 时,它会抛出异常,因为正在访问该属性并且它将执行其工作。
请澄清一下。
谢谢,
Sai Pavan
T?
没有定义运算符(无论如何也行不通)。 - Felix K.