【问题标题】:understanding Possible null reference return理解可能的空引用返回
【发布时间】:2020-07-29 02:17:01
【问题描述】:

我开始在 VS19 预览版中收到这些警告,并且

<TargetFramework>net5.0</TargetFramework>
<LangVersion>preview</LangVersion>`
<Nullable>enable</Nullable>

这是一个类的示例,它代理了很多它的方法到ImmutableList&lt;T&gt;

class C<T> {
  readonly ImmutableList<T> composed;
  public C() => composed = ImmutableList<T>.Empty;
  ...
  public T Find(Predicate<T> match) => composed.Find(match);
  ...
}

警告 CS8603:可能返回空引用。 对于Find 方法

我不明白为什么它的签名与 ImmutableList&lt;T&gt;.Find 相同? 解决此问题的最佳方法是什么?

【问题讨论】:

  • 也许可以试试.First()
  • @zaitsman 这将解决问题,但引入异常的可能性。

标签: c# c#-8.0 nullable-reference-types c#-9.0


【解决方案1】:

the docs中有描述

返回

匹配指定谓词定义的条件的第一个元素,如果找到的话;否则,T 类型的默认值。

所以返回T? 或者使用?? 来返回一个非空值。

关于相同的签名,在代码中你可以看到:

[return: MaybeNull]
public T Find(Predicate<T> match)

the code on github

还有docs for [MaybeNull]

指定即使相应类型不允许输出也可以为空。

【讨论】:

  • 那么 ImmutableList 如何使用完全相同的签名?这就是让我困惑的地方
  • @kofifus 因为它不承诺不返回null - 但你 承诺不返回null(因为你在一个使用T表示它支持可空引用类型的类)。
  • “它不承诺不返回 null” - 在哪里?这是否意味着它没有可为空的启用?
  • 正确 - 这就是它的意思。 ImmutableList先于构建于可空引用类型。所以它不能保证不返回null(另外,为什么它会(即使它被启用)?它需要指出“我找不到任何东西”不知何故 - 没有 null,你会怎么做?)。
【解决方案2】:

Find method 将在不匹配时返回 default(T),当 T 为引用类型时返回 null。如果你想防止这种情况发生,你可以constrain your class 只允许值类型,例如。

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2018-01-25
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多