这可能有一个简单的解释我没有看到,但为什么以下代码合法:
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's回答,为什么编译器允许dynamic
const
字段开头?这不是自我挫败吗?我知道这种情况根本没有真正的应用,坦率地说是毫无意义的,但我只是因为偶然的事故而偶然发现并且只是好奇。
答案 0 :(得分:6)
因为dynamic对象在编译时没有被解析,所以编译器不知道它总是为null。直到运行时才会解析动态对象。
修改强>
我看到你的困惑,为什么甚至允许const动态?
我的猜测是动态可以改为非可空类型,在这种情况下,ToString不会返回值,但这只是猜测。我也在想你可能仍然希望能够拥有一个恒定的动态,这样你就可以确保值不会在静态构造函数之外改变,但在运行时才知道类型。
正如Servy所指出的那样,另一种可能性是,这是一个不太值得修复的角落案例。