3

我碰巧浏览了 .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 被调用时,它会抛出一个异常,因为该属性正在被访问并且它会完成它的工作。

请在同一方面澄清

谢谢,

西帕文

4

4 回答 4

2

因为你投到int?而不投到int

public static explicit operator T(Nullable<T> value) { 
    return value.Value; 
}

Tint,但你正在铸造,int?所以Value从未被调用过。

于 2012-10-27T10:49:19.367 回答
2
int? i2 = (int?)i;

只是从int?to的直接复制操作int?。不涉及转换运算符。这是 struct 变量的内存内容的平面副本。

于 2012-10-27T10:55:00.543 回答
1

在 的情况下int? i2 = (int?)i; //No Error,永远不会在 i 上调用显式运算符方法,因为您正在转换为int?not int

于 2012-10-27T10:54:34.660 回答
0

您可能会对显式运算符感到困惑。

它不是“显式运算符”,而是“显式运算符 T”。在您的情况下,这将成为“显式运算符 int”,因为 T 是 int。

显式运算符 int 仅在您显式转换为 int 时才会调用(名称中的线索 ;-))。

因此,如前所述, i1 不需要转换为 int 并且不调用显式运算符 int 。

于 2012-10-28T09:03:10.293 回答