【发布时间】:2022-01-15 01:10:15
【问题描述】:
使用以下代码
abstract class Base
{
protected abstract T? GetValue<T>([CallerMemberName] string propertyName = "");
}
class Derived : Base
{
protected override T GetValue<T>([CallerMemberName] string propertyName = "")
{
return default;
}
}
编译器在return default; 告诉我,我有一个 CS8603“可能的空引用返回”,这是真的。但是,如果我将 ? 附加到该方法的返回类型,以便读取(如抽象方法)protected override T? GetValue<T>([CallerMemberName] string propertyName = ""),编译器会告诉我
- CS0508 'Derived.GetValue(string)':返回类型必须为 'T' 以匹配覆盖的成员 'Base.GetValue(string)'。
- CS0453 类型“T”必须是不可为空的值类型,才能在泛型类型或方法“Nullable”中用作参数“T”。
我如何告诉编译器我的意图 GetValue<T> 可能返回一个空引用,而不是该方法的返回类型应该是 Nullable<T>?
【问题讨论】:
-
T可以仅限于类还是需要同时支持引用和值类型? -
T应该被允许是任何东西——引用类型和值类型。 -
我原以为您可以执行
default(T) is null检查并满足编译器的要求,但事实证明这还不够。根据这篇帖子stackoverflow.com/a/59328672/1165998,这似乎是不可能的。
标签: c# nullable-reference-types