C# 检查值元组是否为默认值

C# 检查值元组是否为默认值,c#,c#-7.2,valuetuple,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的default语法在MyMethod中返回默认值。我无法检查是否返回默认案例?以下是我尝试过的: result is default result ==

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

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

// Later
var result = MyMethod();
if (result is default){ } // doesnt work
我可以使用C#7.2的
default
语法在
MyMethod
中返回默认值。我无法检查是否返回默认案例?以下是我尝试过的:

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

如果您确实想让它返回
默认值
,可以使用

result.Equals(default)
ValueTuple
的内置
Equals
方法应该可以工作

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


result==default
它的工作原理应该是一样的。

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

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

以下是调试器下的内容:


您的尝试有两个问题:

  • 元组上没有定义
    ==
    运算符(在C#7.2中)
  • 要获取元组类型的默认值,需要正确地将该类型括起来:
    default((int,int))
  • 注意,在C#7.3中,元组中添加了一个
    ==
    运算符。然后可以执行
    tuple==default
    (请参阅)。

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

    (string foo, string bar) MyMethod() => default;
    
    // Later
    var result = MyMethod();
    if (result == default){ } // Works!
    

    请参见

    不要返回“默认”元组,而是返回带有结果标志的元组并检查标志。这是最常见的情况之一。此外,
    用于铸造或图案匹配。在本例中,当C#得到它的值时,您要求相等,
    result==default((string,string))
    (编辑:需要额外的括号),甚至
    result==default
    都应该可以工作,但我们还没有做到。@PanagiotisKanavos只是假设开发人员可能无法控制从公共方法返回的内容。至于它意味着什么,它意味着操作没有成功返回有意义的值,只是掩盖了它。正如我前面所说,问题的实质是学习C#语法。@PanagiotisKanavos它不必与已知的值元组直接相关。例如,如果您使用一个执行某些操作的泛型方法,并且有时返回默认值(对于“如果有匹配项,请给我第一个匹配项”,这是完全正确的),那么如果搜索的数据(泛型类型)是一个值元组,会发生什么情况?这是一个真实的用例。@Wolfsblvt该用例与返回null、0或其他神奇值没有什么不同。值元组通过允许使用Rust或Go-like值元组解决了这一问题。返回一个强类型(结果、错误)元组,而不是返回null或magic值并检查null或default。这种方式很难忽略错误谢谢你的详细回答。在最后一行中,我想你指的是
    x.Equals(默认((字符串,字符串)))
    而不是
    Equals(x,默认((字符串,字符串)))
    。实际上这两种情况都通过了。我知道两种情况都通过了,但你重复了
    Equals(x,默认((字符串,字符串))
    两次。我只是说,我认为第二点是不对的
    default
    default(T)
    @nawfal的替代品对不起,我不清楚。我指的是
    default(string,string)
    ,它的语法无效(缺少参数)。