【发布时间】:2020-02-06 14:02:13
【问题描述】:
public readonly struct Foo<T>
{
// ...
public T Value { get; }
}
public static Foo<string?> Bar(Foo<string?> foo)
{
if (foo.Value is null) { /* Something */ }
else { /* Some other thing */ }
return foo;
}
public static void Main()
{
var foo1 = new Foo<string>("s");
var ret1 = Bar(foo1); // Warns because foo1's type parameter is not nullable
var foo2 = new Foo<string?>("s");
var ret2 = Bar(foo2); // Ok because foo2's type parameter is nullable
}
- 我可以写 Bar 来接受
Foo<string?>和Foo<string>吗? - 我可以注释Bar来指定“什么进去就出去”,所以返回的
Foo<T>的T的可空性将与参数Foo<T>的T的可空性相同?李>
【问题讨论】:
-
有很多属性可以让你注释一些依赖,但不是全部。基本上,它的目的不是解决所有可空性问题,只是解决大部分问题。
-
例如,您可以设置一个依赖项,说明“如果使用非空引用调用此方法调用的结果将不为空”,但您不能将其嵌套在类型,只有值。我建议创建两个重载并重命名其中一个,可能使用 TryXYZ 方法名称前缀。
-
让
Bar也像public static Foo<T> Bar<T>(Foo<T> foo)一样通用怎么样? sharplab.io/… -
如果该方法只应该采用
Foo<string>(可空或不可空),那么这会产生它自己的问题,您现在有一个采用Foo<anything>的方法并且必须处理那个。 -
@Lasse - 是的,我找不到允许我对此进行注释的人,我担心没有办法。你建议有两种不同的方法肯定会奏效,但它真的很难看。是的,对于这种方法来说,null 是有效的,我会处理它。
标签: c# .net-core .net-core-3.0 c#-8.0 nullable-reference-types