如何比较可空类型?

Dav*_*001 58 c# extension-methods nullable

我有几个地方需要比较2(可空)值,看看它们是否相同.

我认为框架中应该有一些东西可以支持这个,但找不到任何东西,所以请注意以下几点:

public static bool IsDifferentTo(this bool? x, bool? y)
{
    return (x.HasValue != y.HasValue) ? true : x.HasValue && x.Value != y.Value;
}
Run Code Online (Sandbox Code Playgroud)

然后,在我的代码中 if (x.IsDifferentTo(y)) ...

然后我有类似的可以为空的int,可空的双打等方法.

是否有更简单的方法来查看两个可空类型是否相同?

更新:

原来这个方法存在的原因是因为代码已经从VB.Net转换而来,其中Nothing = Nothing返回false(与C#相比,null == null返回true).应该使用VB.Net代码.Equals....

Mar*_*ell 72

C#支持"提升"运算符,因此如果bool?在编译时已知类型(在本例中),您应该只能使用:

return x != y;
Run Code Online (Sandbox Code Playgroud)

如果你需要泛型,那么EqualityComparer<T>.Default你的朋友是:

return !EqualityComparer<T>.Default.Equals(x,y);
Run Code Online (Sandbox Code Playgroud)

但请注意,这两种方法都使用" null == null"方法(与ANSI SQL形成对比).如果你需要" null != null"那么你必须单独测试:

return x == null || x != y;
Run Code Online (Sandbox Code Playgroud)


Ant*_*lev 39

Nullable.Equals<T>

  • 其他答案声称当 x 和/或 y 是 Nullable&lt;T&gt; 的实例时,“x.Equals(y)”和“x == y”工作得很好。链接方法有何不同?什么时候应该使用它? (4认同)
  • +1用于使用C#和VB.Net. (3认同)
  • 或者`Nullabe.Compare <T>`如果你正在寻找一个`IComparable <T>`impl (2认同)

Kas*_*hif 22

if (x.Equals(y)) 
Run Code Online (Sandbox Code Playgroud)

  • @Chris:你应该再次回答这个问题.可空类型`T?`不是引用类型,它是`System.Nullable <T>`.这是一个结构,所以:值类型.Muhammad的代码完全合法,如果x为null,则不会抛出NullReferenceException. (11认同)
  • 您能告诉我为什么投反对票吗?只是想知道我错在哪里。 (2认同)
  • @Chris:哦,对不起,对不起,我误读了您没有否决答案,所以您可以自由赞成或不赞成;) (2认同)

Mar*_*ann 6

您可以在System.Object上使用静态Equals方法:

var equal = object.Equals(objA, objB);
Run Code Online (Sandbox Code Playgroud)


Luc*_*ero 5

只是使用==,或.Equals().