2009-10-08 47 views
2

我在这里谈论C#语言。在msdn的Object.Equals(Object)方法的是可空的<T>。等式方法实现错误?

定义是:

确定指定 Object是否等于当前的Object。

如果两个对象相等,则返回true,但是如果他们是null,则返回false:

x.Equals(空引用(在 Visual Basic中为Nothing))返回false。

为什么?因为null不是一个对象。

如果对象参数是空值,则抛出NullReferenceException。

和我们也有这样的:

x.Equals(y)返回相同的值 y.Equals(X)。

直到这里都没问题。它与Java非常相似。但C#还为非空类型提供了System.Nullable结构。据我所知,一个结构是一个对象。它继承Object.Equals方法。

如果我有这样的结构:

struct Car 
    { 
     public string Make; 
     public string Model; 
     public uint Year; 

     public Car(string make, string model, uint year) 
     { 
      Make = make; 
      Model = model; 
      Year = year; 
     } 
    } 

,打造四个实例:

Car car1 = new Car("make", "model", 2009); 
Car car2 = new Car("make", "model", 2009); 
Car car3 = new Car("make", "model", 2008); 

car1.Equals(car2); // will return true 
car1.Equals(car3); // will return false; 

而且据我所知,我们不能设置一个结构为空值。但是System.Nullable是一个结构,我们可以做编译这个没有任何错误:

int? i = null; 

(?我希望有人能也解释了这个它是一个结构或其他什么东西)

我真正的问题是:

i.Equals(null); // returns true! 

(通常x.Equals(Y)= y.Equals(X)当然null.Equals(I)的无效这里...)

显然的Object.Equals方法在这里重写。也许它被记录下来,并且这是特定的。但是这种方法是正确的还是很好的?如果是这样,==和Equals方法之间的Nullable值有什么区别?

回答

9

我觉得你的困惑是植根于以下行

i? = null; 

这并不真正创建一个空值的变量。它基本上是以下的合成糖:

Nullable<int> i = new Nullable<int>(); 

生成的HasValue属性值为false。它不是null,而是一个空值的值类型。或者只是一个空的空值。恕我直言,最好的办法是这样的,null可以转换为空的Nullable<T>对于任何给定的T.

知道它使行i.Equals(null)有点容易理解。这是语法糖以下

Nullable<int> i = new Nullable<int>(); 
i.Equals(null); 

类型Nullable<T>只覆盖的equals(对象)。虽然此方法的实现认为空值等于空的可空值。所以它的行为是正确的。

+0

但是,无论它在后台我们调用i.Equals(null),并且当我为null时它会返回true。它应该返回false为其他对象。 – JCasso 2009-10-08 23:50:48

+0

@jcasso,Nullable的一般...都很奇怪,而且往往以意想不到的方式行事。部分困惑是我永远不能为空,因为它实际上是一个值类型。最好把它看作是一个空的可空对象。 – JaredPar 2009-10-08 23:52:07

+0

至少你接受它是奇怪的:)我以为我是唯一的一个。 – JCasso 2009-10-08 23:53:43

2

为了回答你的问题,Nullable是一个带有T:Struct约束的结构。那么,即使int? i = null;是空的,我是Nullable结构的一个实例。

+0

结构可能会采用空值?你可以定义Car car4 = null; ? – JCasso 2009-10-08 23:52:22

+1

就CLR而言,Struct不能有'null'值。在C#中,当你写'int? x = null',你实际上正在写'int? x = new int?()'。根本没有真正的'空'。 – 2009-10-08 23:56:53

+1

没有。但是当你做int?我=“某些合法价值”,CLR将这种合法价值放入i的价值属性中。此外,只是FYI,Nullable会覆盖Equals方法 – 2009-10-08 23:57:10

相关问题