我有一个方法叫Foo,接受一个字符串参数。如果这个字符串参数是null,那么它会执行一些操作;如果不是null(null也是合法的值),则会执行其他操作。最后,它会返回相同的字符串参数。
以下是在C# 8.0中禁用可空引用类型的Foo方法:
string Foo(string s)
{
// Do something with s.
return s;
}
void Bar()
{
string s = "S";
string s2 = Foo(s);
string n = null;
string n2 = Foo(n);
}
启用可空引用类型后,string n = null
会产生警告。这是有道理的,因为string
不再是可空的了。我将它的类型转换为string?
:
void Bar()
{
string s = "S";
string s2 = Foo(s);
string? n = null; // X
string? n2 = Foo(n);
}
现在Foo(n)
警告我,Foo不再支持可空字符串。这也是有道理的 - Foo应该接受可空字符串,因为它支持null和非null值。我改变了它的参数和返回类型为string?
:
string? Foo(string? s)
{
// Do something with s.
return s;
}
这次是关于
string s2 = Foo(s)
的问题,它抱怨 Foo 返回了一个 string?
,而我试图将其赋值给一个 string
。有没有办法让流分析理解这样一个事实:当我提供一个
string
给 Foo(而不是一个 string?
)时,它的返回值就不可能为 null?
[NullInNullOut]
(名称尚未确定)。https://github.com/dotnet/roslyn/issues/26761 - Julien CouvreurC<string?> M(C<string?> arg)
- Şafak Gür