6

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

    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()': 不是所有的代码路径都返回一个值

为什么nullObject存在dynamic使编译器无法断言nullObject永远存在的事实null

编辑:扩展问题,并根据smoore 的回答,为什么编译器允许dynamic const字段以开头?是不是有点自暴自弃?我知道这个场景根本没有真正的应用,坦率地说它毫无意义,但我完全是偶然发现的,只是很好奇。

4

1 回答 1

6

因为动态对象在编译时不会被解析,所以编译器不知道它会一直为空。直到运行时才会解析动态对象。

编辑:

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

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

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

于 2013-05-09T15:55:57.107 回答