检查值元组是否为默认值

naw*_*fal 23 c# valuetuple c#-7.2

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

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

// Later
var result = MyMethod();
if (result is default){ } // doesnt work
Run Code Online (Sandbox Code Playgroud)

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

result is default
result == default
result is default(string, string)
result == default(string, string)
Run Code Online (Sandbox Code Playgroud)

Gib*_*bon 24

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

result.Equals(default)
Run Code Online (Sandbox Code Playgroud)

Equals一个ValueTuple应该工作的内置方法.

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

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


Kit*_*Kit 10

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

    [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)))
    }
Run Code Online (Sandbox Code Playgroud)

default在比较中使用之前的简单必须从其"纯" null到具有成员默认值的值元组.

这是调试器下的内容:

在此输入图像描述


phi*_*utt 6

从 C# 7.3 开始,元组类型现在支持 == 和 !=。所以你的代码可能是这样的:

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

// Later
var result = MyMethod();
if (result == default){ } // Works!
Run Code Online (Sandbox Code Playgroud)

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


Jul*_*eur 5

您的尝试有两个问题:

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

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