C# 检查值元组是否为默认值
如何检查System.ValueTuple是否为默认值?粗略的例子: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 ==
(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)
,它的语法无效(缺少参数)。