我在这里谈论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值有什么区别?
但是,无论它在后台我们调用i.Equals(null),并且当我为null时它会返回true。它应该返回false为其他对象。 – JCasso 2009-10-08 23:50:48
@jcasso,Nullable的一般...都很奇怪,而且往往以意想不到的方式行事。部分困惑是我永远不能为空,因为它实际上是一个值类型。最好把它看作是一个空的可空对象。 – JaredPar 2009-10-08 23:52:07
至少你接受它是奇怪的:)我以为我是唯一的一个。 – JCasso 2009-10-08 23:53:43