【问题标题】:Inconsistent behavior in C# 8 nullable reference type handling with generics使用泛型处理 C# 8 可空引用类型中的不一致行为
【发布时间】:2020-01-07 15:20:20
【问题描述】:

我有这个代码:

public T? Foo<T>()
    where T : class?
{
    return null;
}

它给出了一个符合逻辑和预期的错误:

必须知道可空类型参数是值类型或不可空引用类型。考虑添加“类”、“结构”或类型约束。

现在我再添加一个约束:

public T? Foo<T>()
    where T : class?, IDisposable // Could be any interface I guess
{
    return null;
}

现在有趣的是,错误刚刚消失了。虽然在我看来我们确实存在相互冲突的约束,因为接口是 non-nullalbeclass? 是。

我在这里遗漏了什么还是编译器有问题?

【问题讨论】:

  • 你需要IDisposable?。是的,这令人困惑。
  • 你见过这个吗? -> stackoverflow.com/questions/55975211/…
  • 是的,我用? 进行了测试,它可以编译。具有讽刺意味的是,它也像 where T : class, IDisposable? 那样编译
  • 如果至少有一个约束不可为空,则似乎整个约束不可为空
  • @IlyaChernomordik 听起来很有说服力,因为约束是与连接的。

标签: c# generics nullable-reference-types


【解决方案1】:

泛型类型约束where T : IDisposable 表示“T 必须不可为空且必须实现IDisposable”。如果您有多个具有不同可空性的泛型类型约束,则总体上的约束只有在所有约束都可以为空时才可以为空。

所以class? 可以为空这一事实被IDisposable 不可为空这一事实所覆盖。

你需要where T : class?, IDisposable?

【讨论】:

  • 感谢您的回答,它似乎是这样工作的,但它真的有点不明显,有点令人困惑。我还尝试使用这样的约束返回可空值,但这不起作用:stackoverflow.com/questions/59631460/…
  • 同意,我也觉得这不明显且令人困惑。而且很容易被遗忘!
猜你喜欢
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
相关资源
最近更新 更多