动态字段const与任何旧的引用字段const行为



这可能有一个简单的解释,我没有看到,但是为什么下面的代码是合法的:

    public struct Foo
    {
        const object nullObject = null;
        public override string ToString()
        {
            if (nullObject == null)
            {
                return base.ToString();
            }
        }
    }

而下面,

    public struct Foo
    {
        const dynamic nullObject = null;
        public override string ToString()
        {
            if (nullObject == null)
            {
                return base.ToString();
            }
        }
    }

给出以下编译时错误:Foo.ToString()':不是所有代码路径返回值?

为什么nullObjectdynamic使得编译器不能断言nullObject总是null ?

EDIT:扩展问题,根据smoore的回答,为什么编译器允许dynamic const字段开始?这不是有点弄巧成拙吗?我知道这个场景根本没有实际应用,坦率地说,它毫无意义,但我偶然发现了它,只是好奇。

因为动态对象在编译时没有解析,所以编译器不知道它总是为空。直到运行时才解析动态对象。

编辑:

我看到你的困惑,为什么甚至允许const动态?

我的猜测是,Dynamic可以更改为非空类型,在这种情况下ToString将不返回值,但这只是一个猜测。我还认为,您可能仍然希望有一个动态常数的能力,以便您可以确保值不会在静态构造函数之外更改,但直到运行时才知道类型。

另一种可能性,正如Servy指出的,是这样一个角落的情况,它不值得修复。

最新更新