4

我正在使用NullableContextOptions启用了(可空引用)的 C# 8.0。

我有一个带有这个签名的函数:

public static (int line, string content)? GetNextNonEmptyLineDown(this IList<string> contents, int fromLine)

基本上,如果有非空行,则返回该行和内容,如果没有,则返回。

问题是我不知道如何解构它。如果我尝试:

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;
4

1 回答 1

8

这个关于可空类型的问题

任何 Nullable 都可以隐式转换为其 T,前提是要评估的整个表达式永远不会导致对 ValueType 的空赋值。

因此,您正在寻找的是在解构的右侧放置一个肯定不为空的表达式。一个优雅的方法是:

var (firstLineIndex, firstLine) = lineinfo ?? default;

??null-coalescing 运算符:如果它不为 null,则返回其左侧的值,否则返回其右侧的值。我们在右边放置的是默认操作符,它很好地将其返回类型与周围的表达式相匹配。

请注意,使用default主要是为了取悦编译器,您可能不希望在运行时实际使用该值。您仍然应该null事先检查。

于 2019-10-02T17:49:14.693 回答