2011-11-23 27 views
3

空类型比较我有两个对象(同一类型的),其含有byte?类型的支柱myprop。属性设置为null。当我执行objectA.myprop.Equals(objectB.myprop)我得到“真实”,结果虽然MSDN代码示例指出,“等于应用于任何空对象返回false。”的Equals与另一空类型

我猜C#使用了可空类型比较一个单独的过载。我想知道在这种情况下C#在内部如何处理对象与可空类型。

回答

2

当你称呼它,它会使用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支持拳击和拆箱。

+0

+1感谢您的更新乔恩! – arviman

+0

你应该接受这个答案。 – Joe

4

我已经编辑本作清晰。

你误解了报价。为了让完整的上下文:

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的相等比较。

http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx

+0

在问题的情况下,不会代码抛出一个空的异常,如果'objectA.myprop'为空,而不是真实的,即使其他属性也为空? – Chris

+0

是的,这将是一个空引用异常。 – Joe

+0

@Chris - 如果它是一个空对象,那将是正确的。但是,它不适用于可以为空的类型,正如您可以通过Joe和Jon提供的链接所分辨的那样。或者你指的是'objectA'本身为空? – arviman

2

空类型是一个结构和结构从来没有得到一个空值,所以当可空类型与空等于,这意味着这个变量不是真的空,而一个隐含的发生和可变投地值为的值类型(可为空)属性值= 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 
+0

+1可提及Nullable类型是一个结构体。 – arviman

相关问题