如何解构 Nullable Tuple?
How to deconstruction Nullable Tuple?
我正在使用启用了 NullableContextOptions
(可空引用)的 C# 8.0。
我有一个带有这个签名的函数:
public static (int line, string content)? GetNextNonEmptyLineDown(this IList<string> contents, int fromLine)
基本上是returns行和下面有非空行的内容,returns如果有none.
问题是我不知道如何解构它。如果我尝试:
var (firstLineIndex, firstLine) = content.GetNextNonEmptyLineDown(0);
我收到 4 个语法错误:
所以我只能用:
var lineInfo = content.GetNextNonEmptyLineDown(0);
var firstLineIndex = lineInfo.Value.line;
var firstLine = lineInfo.Value.content;
这破坏了目的。 lineInfo
的类型是 struct<T> where T is (int line, string content)
有解构可空元组的方法吗?
编辑:发布问题后,我想到允许解构可空元组是没有意义的,因为可能无法确定变量的数据类型。这是我目前的解决方法,但想知道这是否是最好的方法:
var lineInfo = content.GetNextNonEmptyLineDown(0);
if (lineInfo == null)
{
throw new Exception();
}
var (firstLineIndex, firstLine) = lineInfo.Value;
来自this question on nullable types:
Any Nullable is implicitly convertible to its T, PROVIDED that the entire expression being evaluated can never result in a null assignment to a ValueType.
所以你要找的是在解构的右边放置一个 surely not-null 表达式。一个优雅的方法是:
var (firstLineIndex, firstLine) = lineinfo ?? default;
??
是 null-coalescing operator:如果它不为空,它 return 就是它左边的值,否则就是它右边的值。
我们放在右边的是 default operator,它非常适合周围表达式的 return 类型。
请注意,使用 default
主要是为了取悦编译器,您可能不希望在运行时实际使用该值。您仍应事先检查 null
。
如果你想将值类型的可为空的元组解构为 Nullable 这可行(DateTime 示例):
(DateTime start, DateTime end)? foo = null;
(DateTime? start, DateTime? end) = foo ?? ((DateTime?)null, (DateTime?)null);
丑陋,但有效...可以用扩展方法美化,但你几乎需要一个用于 ValueTuple
.
的每个参数
我正在使用启用了 NullableContextOptions
(可空引用)的 C# 8.0。
我有一个带有这个签名的函数:
public static (int line, string content)? GetNextNonEmptyLineDown(this IList<string> contents, int fromLine)
基本上是returns行和下面有非空行的内容,returns如果有none.
问题是我不知道如何解构它。如果我尝试:
var (firstLineIndex, firstLine) = content.GetNextNonEmptyLineDown(0);
我收到 4 个语法错误:
所以我只能用:
var lineInfo = content.GetNextNonEmptyLineDown(0);
var firstLineIndex = lineInfo.Value.line;
var firstLine = lineInfo.Value.content;
这破坏了目的。 lineInfo
的类型是 struct<T> where T is (int line, string content)
有解构可空元组的方法吗?
编辑:发布问题后,我想到允许解构可空元组是没有意义的,因为可能无法确定变量的数据类型。这是我目前的解决方法,但想知道这是否是最好的方法:
var lineInfo = content.GetNextNonEmptyLineDown(0);
if (lineInfo == null)
{
throw new Exception();
}
var (firstLineIndex, firstLine) = lineInfo.Value;
来自this question on nullable types:
Any Nullable is implicitly convertible to its T, PROVIDED that the entire expression being evaluated can never result in a null assignment to a ValueType.
所以你要找的是在解构的右边放置一个 surely not-null 表达式。一个优雅的方法是:
var (firstLineIndex, firstLine) = lineinfo ?? default;
??
是 null-coalescing operator:如果它不为空,它 return 就是它左边的值,否则就是它右边的值。
我们放在右边的是 default operator,它非常适合周围表达式的 return 类型。
请注意,使用 default
主要是为了取悦编译器,您可能不希望在运行时实际使用该值。您仍应事先检查 null
。
如果你想将值类型的可为空的元组解构为 Nullable 这可行(DateTime 示例):
(DateTime start, DateTime end)? foo = null;
(DateTime? start, DateTime? end) = foo ?? ((DateTime?)null, (DateTime?)null);
丑陋,但有效...可以用扩展方法美化,但你几乎需要一个用于 ValueTuple
.