修复方法重写中的“CS8603:可能返回空引用”

Dav*_*vid 3 c# nullable-reference-types

用下面的代码

abstract class Base
{
    protected abstract T? GetValue<T>([CallerMemberName] string propertyName = "");
}

class Derived : Base
{
    protected override T GetValue<T>([CallerMemberName] string propertyName = "")
    {
        return default;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器告诉我,return default;我有一个 CS8603“可能的空引用返回”,这是真的。但是,如果我将 a 附加?到该方法的返回类型,以便读取(如抽象方法),protected override T? GetValue<T>([CallerMemberName] string propertyName = "")编译器会告诉我

  • CS0508“Derived.GetValue(string)”:返回类型必须为“T”才能匹配重写成员“Base.GetValue(string)”。
  • CS0453 类型“T”必须是不可为 null 的值类型,才能将其用作泛型类型或方法“Nullable”中的参数“T”。

如何告诉编译器我的意图GetValue<T>可能返回空引用,而不是该方法的返回类型应该是Nullable<T>

Dav*_*vid 5

解决方案是将[return: MaybeNull]属性放置在方法重写上,如下所示:

[return: MaybeNull]
protected override T GetValue<T>([CallerMemberName] string propertyName = "")
{
  return default;
}
Run Code Online (Sandbox Code Playgroud)

编译器现在不再列出警告 CS8603。