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

时间:2013-05-09 15:47:52

标签: c#

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

    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

编辑:扩展问题,并根据smoore's回答,为什么编译器允许dynamic const字段开头?这不是自我挫败吗?我知道这种情况根本没有真正的应用,坦率地说是毫无意义的,但我只是因为偶然的事故而偶然发现并且只是好奇。

1 个答案:

答案 0 :(得分:6)

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

修改

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

我的猜测是动态可以改为非可空类型,在这种情况下,ToString不会返回值,但这只是猜测。我也在想你可能仍然希望能够拥有一个恒定的动态,这样你就可以确保值不会在静态构造函数之外改变,但在运行时才知道类型。

正如Servy所指出的那样,另一种可能性是,这是一个不太值得修复的角落案例。