首页 > 解决方案 > C# 8 在返回具有可空约束的可空泛型时发出警告

问题描述

这段代码:

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

给出以下错误:

当 'T' 是不可为空的引用类型时,空文字会引入空值

当我们说 T 可以为空时,我不明白为什么我们不能返回 null。如果我们另外尝试返回T?,我们将得到一个T不可为空的错误。

似乎不可能同时具有可为空的约束并返回可为空的结果。

标签: c#genericsnullable-reference-types

解决方案


想象一下你打电话:

string result = Foo<string>();

result现在包含null. 但它是 a string,它不能为空。

编译器警告您Foo<T>可能会调用 whereT不可为空,并且null在这种情况下返回将是意外的。

请注意,这where T : class?意味着它T 可能是可以为空的,但也可能不是。两者stringstring?允许。我不相信有任何方法可以说“T 必须可以为空”。


如果你想说:

  1. T允许为空
  2. 什么时候T不可为空,那么这个类型仍然可以返回null

然后你可以写:

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

夏普实验室

请注意,MaybeNull仅适用于方法的契约而不是它的主体,什么时候我们需要 return null!。但是,您可以在上面的 SharpLab 链接中看到调用者string result = Foo<string>();收到了正确的警告。


推荐阅读