这段代码:
public T Foo<T>()
where T : class?
{
return null;
}
给出以下错误:
当“T”不可为空时,空文字会引入空值
参考类型
我不明白为什么当我们说 T 可以为空时我们不能返回 null。如果我们另外尝试返回T?
我们会得到一个错误T
必须是不可空的。
似乎不可能同时拥有可为空约束并返回可为空结果。
想象一下你打电话:
string result = Foo<string>();
result
现在包含null
。但这是一个string
,它不可为空。
编译器警告你Foo<T>
可以在哪里调用T
不可为空,并且返回null
在这种情况下会出乎意料。
注意where T : class?
意思是T
may可以为空,但也可能不是。两个都string
and string?
被允许。我不相信有什么办法可以说“T
must可以为空”。
如果你想说:
-
T
允许为空
- When
T
不可为空,那么该类型仍然可以返回null
然后你可以写:
[return: MaybeNull]
public T Foo<T>()
where T : class?
{
return null!;
}
SharpLab https://sharplab.io/#v2:C4LgbgpgTglgZgTwD4AEBMBGAsAKBQBgAIUMA6AERgEMBzAOwHsBnYGAYydIGEGATCAIJ0qAGwRMYTANy4AxHQCuIkVQBGIiIQjD1EXCgDMxNIS6EA3rkLXiRgCoB+QgDEGDADx2AfAAoAlFY2QQDuABbQmnaEIMaB1pY4QUEoAOyEisoyiTYAvnGE+YbEACyEALL++QlJNiREUBBMSsCEALwubu51vn5ZQXk4OUA===
注意MaybeNull
只适用于方法的契约而不是其主体,这就是为什么我们需要返回的原因null!
。但是您可以在上面的 SharpLab 链接中看到调用者string result = Foo<string>();
得到正确的警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)