空类型比较我有两个对象(同一类型的),其含有byte?
类型的支柱myprop
。属性设置为null
。当我执行objectA.myprop.Equals(objectB.myprop)
我得到“真实”,结果虽然MSDN代码示例指出,“等于应用于任何空对象返回false。”的Equals与另一空类型
我猜C#使用了可空类型比较一个单独的过载。我想知道在这种情况下C#在内部如何处理对象与可空类型。
空类型比较我有两个对象(同一类型的),其含有byte?
类型的支柱myprop
。属性设置为null
。当我执行objectA.myprop.Equals(objectB.myprop)
我得到“真实”,结果虽然MSDN代码示例指出,“等于应用于任何空对象返回false。”的Equals与另一空类型
我猜C#使用了可空类型比较一个单独的过载。我想知道在这种情况下C#在内部如何处理对象与可空类型。
当你称呼它,它会使用Nullable<T>.Equals(object)
这说明文档中预期的行为:
(返回值是true
如果...)
的
HasValue
属性为false,另一个参数是null
。也就是说,根据定义,两个空值是相等的。
同样地,对于通过平等==
中,C#4规范(解除操作员)的部分7.3.7规定:
对于相等运算
==
[和]!=
如果存在操作员的提升形式操作数类型都是非空值类型,如果结果类型是bool。解除表格是通过添加单个?修饰符到每个操作数类型。 解除运算符认为两个空值等于,并且空值不等于任何非空值。如果两个操作数都是非空值,则解除操作符展开操作数并应用底层操作符生成布尔结果。
(重点煤矿)
编辑:现在,我居然不同意在这里接受的答案,它说,它不是一个一般的规则。这是一般规则,在object.Equals
的执行方面:
下面的语句必须Equals方法的所有实现是真实的。在列表中,x,y和z表示不为null的对象引用。
[...]
x.Equals(null)
返回false。
因此,尽管是一般情况下,它不会在这种特殊情况下适用 - 因为这里的值不是一个对象参考 - 这是一个值类型值。它仍然有点令人惊讶,除非你基本上接受Nullable<T>
有点特殊情况 - 它具有特定的C#编译器支持和它具有CLR支持拳击和拆箱。
我已经编辑本作清晰。
你误解了报价。为了让完整的上下文:
string s = null;
string t = String.Empty; // Logically the same as ""
// Equals applied to any null object returns false.
bool b = (t.Equals(s));
这是说,到string
对象的引用并不等同于一个null
参考。你在语境之外引用了这句话,并将其解释为一般规则,但事实并非如此。但是这是指引用不可为空的类型。
当你正在处理可空基本类型:
实际规则是
2种可空类型都为null 计算结果为true的相等比较。
空类型是一个结构和结构从来没有得到一个空值,所以当可空类型与空等于,这意味着这个变量不是真的空,而一个隐含的投发生和可变投地值为的值类型(可为空)属性值= null。所以:
int? a=null;//(a) get a memory space with value property = null
a.GetHashcode();//if (a) really is null must throw a exception but not throw
+1可提及Nullable类型是一个结构体。 – arviman
+1感谢您的更新乔恩! – arviman
你应该接受这个答案。 – Joe