如何比较可空类型?

问题描述 投票:0回答:8

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

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

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

然后,在代码中我有

if (x.IsDifferentTo(y)) ...

然后我对可空整数、可空双精度等有类似的方法。

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

更新:

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

.Equals...
来代替。

c# extension-methods nullable
8个回答
91
投票

C# 支持“提升”运算符,因此如果类型(在本例中为

bool?
)在编译时已知,您应该能够使用:

return x != y;

如果您需要仿制药,那么

EqualityComparer<T>.Default
是您的朋友:

return !EqualityComparer<T>.Default.Equals(x,y);

但请注意,这两种方法都使用“

null == null
”方法(与 ANSI SQL 对比)。如果您需要“
null != null
”,那么您必须单独测试:

return x == null || x != y;

49
投票

32
投票

您可以使用Nullable<T>

Equals
方法:

bool areDifferent = x.Equals(y);

你的方法是多余的

您的方法则简化为:

public static bool IsDifferentTo(this bool? x, bool? y) => !x.Equals(y);

这对于仅仅调用 equals 来说是多余的:

  • one.IsDifferentTo(other)
    !one.Equals(other)
    相同。
  • IsDifferentTo(one, other)
    !Nullable.Equals(one,other)
    相同。

避免 NullReferenceExceptions 的安全

这不会抛出 NullReferenceException,因为

int?
Nullable<int>
的同义词)是一个结构体 — 一种值类型,而不是引用类型。 您可以快速测试一下:

Nullable<int> test = null;
// result is false; no NullReferenceException is thrown.
bool isNull = test.HasValue;

6
投票

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

var equal = object.Equals(objA, objB);


5
投票

只需使用

==
.Equals()


3
投票

我想找到如何在 C# 上比较两个可为空的 int,但我总是在搜索后得到此链接,因此如果有人需要精确比较两个可为空的 int,那么这会很有帮助

a.GetValueOrDefault(int.MinValue).CompareTo(b.GetValueOrDefault(long.MinValue));


1
投票
(x?? 0).Equals(y)

将处理 null 以及 equals。

© www.soinside.com 2019 - 2024. All rights reserved.