我只是看着这个答案,其中包含Nullable<T>.NET Reflector 的代码,我注意到两件事:
Nullable<T>去往时需要显式转换T.==运营商没有定义.鉴于这两个事实,令我惊讶的是,这编译:
int? value = 10;
Assert.IsTrue(value == 10);
Run Code Online (Sandbox Code Playgroud)
与代码value == 10,无论是value被神奇转化为int(因此允许int的==操作者使用,或==操作者被用于被奇迹般地定义Nullable<int>(或者,我假定的可能性较小,反射器是留出一些代码).
我希望必须做以下其中一项:
Assert.IsTrue((value.Equals(10)); // works because Equals *is* defined
Assert.IsTrue(value.Value == 10); // works because == is defined for int
Assert.IsTrue((int?)value == 10); // works because of the explicit conversion
Run Code Online (Sandbox Code Playgroud)
这些当然有效,但==也有效,而这是我没有得到的部分.
我之所以注意到这一点并且问我这个问题的原因是我正在尝试编写一个类似于它的结构Nullable<T>.我从上面链接的Reflector代码开始,并做了一些非常小的修改.不幸的是,我的CustomNullable<T>工作方式不同.我无法做到Assert.IsTrue(value == 10) …