Ove*_*urg 7 c# nullable non-nullable c#-10.0
当我写下这个声明时:
var x = new ClassName();
x隐式键入为ClassName?. 也就是说,由于ClassName是引用类型,因此隐式赋值会var自动定义为可空(即使我提供非空实例并且从不修改它)。
我的问题是,在使用“var”关键字时,有什么方法可以使非空性成为默认值吗?
我知道这个问题和相关信息:Why does Visual Studio Type a Newly Minted Array as Nullable?
使用“var”关键字时有什么方法可以使非空性成为默认值
不,正如文档中所述-var始终意味着可为空的引用类型:
当
var与启用可为 null 的引用类型一起使用时,它始终暗示可为 null 的引用类型,即使表达式类型不可为 null。编译器的空状态分析可防止取消引用潜在的空值。如果变量从未分配给可能为 null 的表达式,则编译器不会发出任何警告。如果将变量分配给可能为 null 的表达式,则必须在取消引用它之前测试它是否不为 null,以避免出现任何警告。
但是空状态分析可以确定变量是否实际上不为空,并且在很多情况下不会发出警告(因此引用中强调的部分):
public class C
{
public string M(string? j) {
var foo = "";
var bar = j;
// return foo; // no warning
return bar; // warning
}
}
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因您仍然需要显式不可为 null 的类型,则在某些情况下可以使用目标类型的新表达式来解决:
MyClass x = new();
Run Code Online (Sandbox Code Playgroud)
您还可以考虑禁用可空引用类型(整个项目的局部)或使用空值宽容运算符 ( !)。