检查值元组是否为默认值
Check if value tuple is default
如何检查 System.ValueTuple 是否为默认值?粗略示例:
(string foo, string bar) MyMethod() => default;
// Later
var result = MyMethod();
if (result is default){ } // doesnt work
我可以使用 C# 7.2 的 default
语法 return MyMethod
中的默认值。我无法检查默认情况?这些是我尝试过的:
result is default
result == default
result is default(string, string)
result == default(string, string)
如果你真的想让它返回 default
,你可以使用
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
在用于比较之前,必须将其 "pure" null
具体化为具有成员默认值的值元组。
这是我在调试器下的结果:
您的尝试有两个问题:
- 元组上没有定义
==
运算符(在 C# 7.2 中)
- 要获取元组类型的默认值,您需要正确地将类型括起来:
default((int, int))
请注意,在 C# 7.3 中向元组添加了一个 ==
运算符。然后你可以做tuple == default
(见live example)。
从 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
注意到答案中缺少代码和文档,因此我在 .NET 5 中尝试了几种不同的相等性检查,全部使用 ==
,以了解它们的评估方式。阐明。
底线似乎是,如果元组中的所有单个值都是它们自己的 default
版本,则元组是 default
。如果你新建一个 = default
的元组,所有内容都设置为它自己的 default
.
版本
这有点道理。
实际代码1
NOTE: This test was performed in a .NET 5 console app.
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
}
如何检查 System.ValueTuple 是否为默认值?粗略示例:
(string foo, string bar) MyMethod() => default;
// Later
var result = MyMethod();
if (result is default){ } // doesnt work
我可以使用 C# 7.2 的 default
语法 return MyMethod
中的默认值。我无法检查默认情况?这些是我尝试过的:
result is default
result == default
result is default(string, string)
result == default(string, string)
如果你真的想让它返回 default
,你可以使用
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
在用于比较之前,必须将其 "pure" null
具体化为具有成员默认值的值元组。
这是我在调试器下的结果:
您的尝试有两个问题:
- 元组上没有定义
==
运算符(在 C# 7.2 中) - 要获取元组类型的默认值,您需要正确地将类型括起来:
default((int, int))
请注意,在 C# 7.3 中向元组添加了一个 ==
运算符。然后你可以做tuple == default
(见live example)。
从 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
注意到答案中缺少代码和文档,因此我在 .NET 5 中尝试了几种不同的相等性检查,全部使用 ==
,以了解它们的评估方式。阐明。
底线似乎是,如果元组中的所有单个值都是它们自己的 default
版本,则元组是 default
。如果你新建一个 = default
的元组,所有内容都设置为它自己的 default
.
这有点道理。
实际代码1
NOTE: This test was performed in a .NET 5 console app.
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
}