在.NET 6.0中使用C#时,我遇到了“无法将空文本转换为不可为空的引用类型”的警告。我认为类是可为空的,并且可以设置为空...
这会产生警告:
public class Foo
{
public string Name { get; set; }
public Foo()
{
Name = "";
}
}
public class Bar
{
public Foo fooClass;
public Bar()
{
// Because I don't want to set it as anything yet.
fooClass = null;
}
public void FooBarInit()
{
fooClass = new Foo();
}
}
但这样做没有给我任何警告
public class Foo
{
public string Name { get; set; }
public Foo()
{
Name = "";
}
}
public class Bar
{
public Foo? fooClass;
public Bar()
{
// Because I don't want to set it as anything yet.
fooClass = null;
}
public void FooBarInit()
{
fooClass = new Foo();
}
}
但是,现在我们尝试在Bar内部的Foo中使用Name变量
public class Foo
{
public string Name { get; set; }
public Foo()
{
Name = "";
}
}
public class Bar
{
public Foo? fooClass;
public Bar()
{
// Because I don't want to set it as anything yet.
fooClass = null;
}
public void FooBarInit()
{
fooClass = new Foo();
}
public void FooBarTest()
{
Console.WriteLine(fooClass.Name); // Warning here which tells me fooClass maybe null
}
}
然而,如果没有首先运行FooBarInit,FooBarTest将永远不会运行。所以它永远不会为空,如果它为空,我将在那之后遇到一个错误处理情况。
我的问题是,为什么我必须将类设置为允许null,而它们本来就应该接受null?
如果我在声明一个类后使用“?”,我现在必须检查它是否为空...任何时候我想调用那个类,它会让我的代码看起来很糟糕。有什么修复或关闭它的能力吗?
2条答案
按热度按时间ryevplcw1#
虽然这是一个非常好的特性,但是仍然可以通过在
.csproj
文件中将Nullable
属性的值更改为disable
来禁用它:bt1cpqcv2#
如果您知道可以为null的型别值不可能为null,则可以使用null-forgiving operator。
Console.WriteLine(fooClass!.Name);
您也可以(与Kotlindev有点奇怪)使用以下机制将
null
赋给不可空类型:public Foo fooClass = null!;
This answer暗示它类似于在Kotlin中使用
lateinit
,它对编译器说“我保证在我开始使用它的时候,它将被设置为非null的值”。你可以用这种技术将变量初始化为null,但是你不能在以后 * 设置 * 它为null。