如何解构可空元组?

时间:2019-03-02 18:23:31

标签: c# tuples nullable nullablereferencetypes deconstruction

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

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

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

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

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

var (firstLineIndex, firstLine) = content.GetNextNonEmptyLineDown(0);

我收到4个语法错误:

enter image description here

所以我只能使用:

        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;

1 个答案:

答案 0 :(得分:1)

来自this question on nullable types

  

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

因此,您要寻找的是在解构函数的右边放置一个肯定非空的表达式。做到这一点的一种优雅方法是:

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

??null-coalescing operator:如果不为null,则返回其左侧的值,否则返回其右侧的值。 我们在右边放置的是default operator,它的返回类型非常适合周围的表达式。

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