检查值元组是否为默认值

时间:2018-04-30 12:35:39

标签: c# c#-7.2 valuetuple

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

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

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

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

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

4 个答案:

答案 0 :(得分:21)

如果你真的想让它继续default,你可以使用

result.Equals(default)

Equals的内置ValueTuple方法应该有用。

从C#7.3开始,值元组现在也完全支持通过==!=进行比较, 这意味着你现在也可以做到

result == default它的工作原理相同。

答案 1 :(得分:8)

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

    [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为具有成员默认值的值元组。

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

enter image description here

答案 2 :(得分:5)

您的尝试有两个问题:

  1. 元组上没有定义==运算符(在C#7.2中)
  2. 要获取元组类型的默认值,您需要正确地为该类型加上括号:default((int, int))
  3. 请注意,{C} 7.3中的元组添加了==运算符。然后,您可以执行tuple == default(请参阅https://docs.python.org/3/library/stdtypes.html#dict.get)。

答案 3 :(得分:2)

从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