Visual Studio C#类不再可以为空了吗?

9rnv2umw  于 2022-11-17  发布在  C#
关注(0)|答案(2)|浏览(221)

在.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?
如果我在声明一个类后使用“?”,我现在必须检查它是否为空...任何时候我想调用那个类,它会让我的代码看起来很糟糕。有什么修复或关闭它的能力吗?

ryevplcw

ryevplcw1#

虽然这是一个非常好的特性,但是仍然可以通过在.csproj文件中将Nullable属性的值更改为disable来禁用它:

<PropertyGroup>
    ...
    <Nullable>disable</Nullable>
    ...
  </PropertyGroup>
bt1cpqcv

bt1cpqcv2#

如果您知道可以为null的型别值不可能为null,则可以使用null-forgiving operator
Console.WriteLine(fooClass!.Name);
您也可以(与Kotlindev有点奇怪)使用以下机制将null赋给不可空类型:
public Foo fooClass = null!;
This answer暗示它类似于在Kotlin中使用lateinit,它对编译器说“我保证在我开始使用它的时候,它将被设置为非null的值”。你可以用这种技术将变量初始化为null,但是你不能在以后 * 设置 * 它为null。

相关问题