Nullable<T>
代码,并注意到两件事情:
- 从
Nullable<T>
到T
时需要显式转换。 ==
运算符未定义。
int? value = 10;
Assert.IsTrue(value == 10);
使用代码
value == 10
时,要么将value
神奇地转换为int
(从而允许使用int
的==
操作符),要么神奇地为Nullable<int>
定义==
操作符。(或者,我认为不太可能的情况是Reflector省略了一些代码。)我希望执行以下操作之一:
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
当然,这些都能用,但==
也能用,这就是我不理解的部分。
我注意到这一点并且提出这个问题是因为我正在尝试编写一个类似于Nullable<T>
的结构体。我从上面链接的反射器代码开始,只做了一些非常小的修改。不幸的是,我的CustomNullable<T>
没有以同样的方式工作。 我无法执行Assert.IsTrue(value == 10)
。我会得到 "Operator ==
cannot be applied to operands of type CustomNullable<int>
and int
"。
现在,无论修改多小,我都不希望能够执行...
CustomNullable<T> value = null;
因为我了解
Nullable<T>
背后有一些编译器魔法,使得即使Nullable<T>
是一个结构体,值也可以被设置为null
,但我希望如果我的代码(几乎)完全相同,我应该能够模仿Nullable<T>
的所有其他行为。
有人能解释一下当它们似乎没有定义时,Nullable<T>
的各种运算符如何工作吗?
==
的发现。无论如何,似乎Nullable<T>
是一个“特权”结构体,编译器对其的处理方式与我自己编写的任何结构体都不同。我已经知道了允许将可空类型设置为null
的魔法,但我想还有更多魔法。我的方向正确吗? - devuxerAssert.IsTrue((int?)value == 10);
,而是Assert.IsTrue((int)value == 10);
吗?正如之前所述,使用(int?)
是一种惊喜,而不是期望。 - vyrp