Luk*_* Vo 4 c# tuples nullable valuetuple
我正在使用NullableContextOptions启用了(可空引用)的C# 8.0 。
我有一个带有此签名的函数:
public static (int line, string content)? GetNextNonEmptyLineDown(this IList<string> contents, int fromLine)
Run Code Online (Sandbox Code Playgroud)
基本上,如果有非空行,它返回行和内容,如果没有则返回。
问题是我不知道如何解构它。如果我尝试:
var (firstLineIndex, firstLine) = content.GetNextNonEmptyLineDown(0);
Run Code Online (Sandbox Code Playgroud)
我收到 4 个语法错误:
所以我只能使用:
var lineInfo = content.GetNextNonEmptyLineDown(0);
var firstLineIndex = lineInfo.Value.line;
var firstLine = lineInfo.Value.content;
Run Code Online (Sandbox Code Playgroud)
这破坏了目的。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;
Run Code Online (Sandbox Code Playgroud)
任何 Nullable 都可以隐式转换为其 T,前提是正在评估的整个表达式永远不会导致对 ValueType 的 null 分配。
所以你要找的是在解构的右边放置一个肯定非空的表达式。一个优雅的方法是:
var (firstLineIndex, firstLine) = lineinfo ?? default;
Run Code Online (Sandbox Code Playgroud)
??是空合并运算符:如果它不为空,则返回其左侧的值,否则返回其右侧的值。我们放在右边的是默认的 operator,它很好地将其返回类型适合周围的表达式。
请注意,使用default主要是为了取悦编译器,您可能不希望在运行时实际使用该值。您仍然应该null事先检查。
| 归档时间: |
|
| 查看次数: |
1332 次 |
| 最近记录: |