使用泛型处理 C# 8 可为空引用类型中的不一致行为

Ily*_*dik 4 c# generics nullable-reference-types

我有这个代码:

public T? Foo<T>()
    where T : class?
{
    return null;
}
Run Code Online (Sandbox Code Playgroud)

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

可以为 null 的类型参数必须是值类型或不可为 null 的引用类型。考虑添加“类”、“结构”或类型约束。

现在我再添加一个约束:

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

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

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

can*_*on7 5

泛型类型约束where T : IDisposable意味着“T必须不可为空且必须实现IDisposable”。如果您有多个具有不同可空性的泛型类型约束,则只有当所有约束都可以为空时,该约束才可以为空。

因此,可以class?为空的事实IDisposable被不可为空的事实所覆盖。

你需要where T : class?, IDisposable?.