37

如何检查 System.ValueTuple 是否为默认值?粗略的例子:

(string foo, string bar) MyMethod() => default;

// Later
var result = MyMethod();
if (result is default){ } // doesnt work

MyMethod我可以使用defaultC# 7.2 的语法返回默认值。我无法检查默认情况下?这些是我尝试过的:

result is default
result == default
result is default(string, string)
result == default(string, string)
4

5 回答 5

45

如果你真的想让它返回default,你可以使用

result.Equals(default)

a的内置Equals方法ValueTuple应该可以工作。

==从 C# 7.3 开始,值元组现在也完全支持比较!=,这意味着您现在也可以这样做

result == default它应该工作相同。

于 2018-04-30T12:44:04.987 回答
13

有几种方法可以将默认值与值元组进行比较:

    [TestMethod]
    public void Default()
    {
        (string foo, string bar) MyMethod() => default;
        (string, string) x = default;

        var result = MyMethod();

        // These from your answer are not compilable
        // Assert.IsFalse(x == default);
        // Assert.IsFalse(x == default(string string));
        // Assert.IsFalse(x is default);
        // Assert.IsFalse(x is default(string string));

        Assert.IsFalse(Equals(x, default));
        Assert.IsFalse(Equals(result, default));

        Assert.IsTrue(Equals(x, default((string, string))));
        Assert.IsTrue(Equals(result, default((string, string))));
        Assert.IsTrue(result.Equals(default));
        Assert.IsTrue(x.Equals(default));
        Assert.IsTrue(result.Equals(default((string, string))));
        x.Equals(default((string, string)))
    }

在比较中使用之前的简单default必须从其“纯”具体化为null具有成员默认值的值元组。

这是我在调试器下的内容:

在此处输入图像描述

于 2018-04-30T12:52:11.943 回答
6

从 C# 7.3 开始,元组类型现在支持 == 和 !=。因此,您的代码可能如下所示:

(string foo, string bar) MyMethod() => default;

// Later
var result = MyMethod();
if (result == default){ } // Works!

请参阅https://docs.microsoft.com/en-us/dotnet/csharp/tuples#equality-and-tuples

于 2018-12-07T19:06:11.020 回答
6

您的尝试有两个问题:

  1. 元组上没有==定义运算符(在 C# 7.2 中)
  2. 要获取元组类型的默认值,您需要正确地将类型括起来:default((int, int))

请注意,==在 C# 7.3 中将运算符添加到元组中。然后你可以做tuple == default(​​见现场例子)。

于 2018-05-01T18:40:46.743 回答
1

注意到答案中缺少代码和文档,因此我在 .NET 5 中尝试了一些不同的相等性检查,所有这些检查都带有==, 以查看它们的评估方式。阐明。

底线似乎是,如果元组中的所有单个值都是它们自己的版本default,则元组是default。如果你新建一个元组,= default所有内容都设置为它自己的default.

这有点道理。

实际代码1

注意:此测试是在 .NET 5 控制台应用程序中执行的。

static void TupleDefault()
{
    (int first, string second) spam = new(1, "hello");
    (int first, string second) spam2 = default;

    Console.WriteLine(spam == default);      // False
    Console.WriteLine(spam2 == default);     // True

    Console.WriteLine(spam2.first);          // 0
    Console.WriteLine(spam2.first == 0);     // True

    Console.WriteLine(spam2.second);         // Nothing.
    Console.WriteLine(spam2.second == null); // True

    // ==== Let's try to create a default "by hand" ====
    (int first, string second) spam3 = new(0, null);

    // It works!
    Console.WriteLine(spam3 == default);     // True
}
于 2021-10-12T14:11:05.173 回答