X。 Equals(null)返回false(仅适用于不可为null的值类型)

时间:2019-03-17 09:07:16

标签: c# equality msdn

在阅读this article时,我看到如果仅对不可为空的值调用null参数,则Object.Equals覆盖应该返回false:

enter image description here

同时阅读给定的示例TwoDPoint是可为空的类型,但它与准则本身矛盾。

enter image description here

那么,实际上为可空类型重载Equals方法的最佳实践是什么?

2 个答案:

答案 0 :(得分:2)

TwoDPoint是一种class类型,它是一种引用类型。这样,特殊值null被允许作为参考。因此,类型p的值TwoDPoint可能是null

使用class类型,即在public bool Equals非静态方法中,“ this”永远不会null,因此返回{每当false参数为p时,{1}}。

null

上面,您将看到它对引用类型的工作方式。

使用特殊的// Example 1 var t = new Point(10, 4); var p = (Point)null; var isEqual = t.Eqauls(p); // should return 'false', therefore the code you ask about // Example 2 var t = (Point)null; var p = (Point)null; var isEqual = t.Eqauls(p); // 'NullReferenceException', method not called 类型(用于可空 value 类型),情况有所不同。但是好消息是,您不必为Nullable<>编写代码,因为它已经在.NET Framework中。

Nullable<>.Equals

在示例4中,没有空的 reference 出现。存在的“空”是// 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'! 结构的值,其Nullable<TimeSpan>属性等于HasValuefalseEquals中声明了Nullable<>方法(在本例中为替代方法),因此没有装箱。

不同:

// Example 5
var t = (TimeSpan?)null;
var type = t.GetType(); // 'GetType' declared in class (System.Object), boxing, 'NullReferenceException'!

答案 1 :(得分:1)

  

TwoDPoint-是可为空的类型

否,import * as React from 'react'; import { any } from 'prop-types'; function handleClick(this:any,name:React.ReactNode) { console.log('The link was clicked.'); this.props.callbackFromParentSearch(name); } export const Suggestions = (props:any) => { const options = props.results.map((r: { id: React.Key; name: React.ReactNode; }) => ( <a href="#" onClick={handleClick(r.name)}> <li key={r.id}> {r.name} </li> </a> )) return <ul>{options}</ul> } export default Suggestions 不是可以为空的类型,Nullable Type应该包含问号:

TwoDPoint是可以为空的类型,它是TwoDPoint?的简写

因此,如果您在可为空的类型上调用Nullable<TwoDPoint>,它将不会调用覆盖/重载的方法。

Equals