c# - 如何解构可空元组?

标签 c# tuples nullable valuetuple

我正在使用启用了 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;

这破坏了目的。 lineInfostruct<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.



所以你要找的是在解构的右边放置一个肯定非空的表达式。一个优雅的方法是:
var (firstLineIndex, firstLine) = lineinfo ?? default;
??null-coalescing operator :如果它不为空,则返回其左侧的值,否则返回其右侧的值。
我们放在右边的是 default operator ,它很好地将其返回类型与周围的表达式相匹配。

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

关于c# - 如何解构可空元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54961617/

相关文章:

kotlin - 如何将类型标记为非空?

c# - 进行 Http 调用时套接字异常

list - OCaml - 向该列表添加一个包含元组列表的新元组

python - 将元组转换为每行一个项目的字符串列表

c# - 重载 Controller Action

spring - 尝试找到一种更语义化的方式在 Kotlin 中编写 Spring Entity

c# - 使用 Unity 将对象注入(inject) IValueConverter 实例

c# - 定时器事件处理程序如何在 .Net 中工作?他们是先发制人吗?

c# - Selenium webdriver 测试 100% 在本地通过,100% 在 VSTS 服务器上失败

python - 如何在Python中创建具有两列作为元组或Pandas数据框的单个变量?