C# 十,。Equals(null)返回false(仅适用于不可为null的值类型)

C# 十,。Equals(null)返回false(仅适用于不可为null的值类型),c#,equality,msdn,C#,Equality,Msdn,读取时,我看到Object.Equals override如果仅为不可为null的值调用null参数,则应返回false: 同时,我阅读了给定的示例-TwoDPoint-是一个可为空的类型,但它与准则本身相矛盾 那么,对于可空类型重载Equals方法的最佳实践是什么呢 TwoDPoint-是可为空的类型 不,TwoDPoint不是可空类型,a应包含问号: 两点?是可为null的类型,是可为null的缩写 因此,如果对可为null的类型调用Equals,它将不会调用重写/重载方法 TwoDPoin

读取时,我看到Object.Equals override如果仅为不可为null的值调用null参数,则应返回false:

同时,我阅读了给定的示例-TwoDPoint-是一个可为空的类型,但它与准则本身相矛盾

那么,对于可空类型重载Equals方法的最佳实践是什么呢

TwoDPoint-是可为空的类型

不,TwoDPoint不是可空类型,a应包含问号:

两点?是可为null的类型,是可为null的缩写

因此,如果对可为null的类型调用Equals,它将不会调用重写/重载方法

TwoDPoint? a = new TwoDPoint();
var b = (TwoDPoint)a;

// call Nullable<TwoDPoint>.Equals, not TwoDPoint.Equals
a.Equals(b);

// call TwoDPoint.Equals
b.Equals(b);
TwoDPoint是一个类类型,它是一个引用类型。因此,引用允许使用特殊值null。所以TwoDPoint类型的p值可能为null

对于类类型,如果您在public bool Equals非静态方法中,则该值永远不会为null,因此只要p参数为null,返回false是正确的

在上面,您可以看到它如何适用于引用类型

对于用于可空值类型的特殊可空类型,情况有点不同。但好消息是,您不必为Nullable.Equals编写代码,因为它已经在.NET Framework中了

// Example 3
var t = (TimeSpan?)TimeSpan.FromHours(3.5);
var p = (TimeSpan?)null;
var isEqual = t.Equals(p); // will return 'false'

// Example 4
var t = (TimeSpan?)null;
var p = (TimeSpan?)null;
var isEqual = t.Equals(p); // OK, method will return 'true'!
在示例4中,没有出现空引用。null present是可为null的结构的一个值,其HasValue属性等于false。Equals方法声明为重写,在本例中为Nullable,因此不会发生装箱

不同的:

// Example 5
var t = (TimeSpan?)null;
var type = t.GetType(); // 'GetType' declared in class (System.Object), boxing, 'NullReferenceException'!
对于可为null的类型,Equalsnull不应该返回false,这只是表明这样的结果不能保证,即不能依赖,即使理想情况下人们通常会认为是这样。不过,该示例是正确的,对于可为null的类型更可取。该保证对于不可为null的值类型是正确的-没有矛盾,只是不同的情况。
// Example 5
var t = (TimeSpan?)null;
var type = t.GetType(); // 'GetType' declared in class (System.Object), boxing, 'NullReferenceException'!