这可能有一个简单的解释,我没有看到,但是为什么下面的代码是合法的:
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
?
EDIT:扩展问题,根据smoore的回答,为什么编译器允许dynamic
const
字段开始?这不是有点弄巧成拙吗?我知道这个场景根本没有实际应用,坦率地说,它毫无意义,但我偶然发现了它,只是好奇。
因为动态对象在编译时没有解析,所以编译器不知道它总是为空。直到运行时才解析动态对象。
编辑:我看到你的困惑,为什么甚至允许const动态?
我的猜测是,Dynamic可以更改为非空类型,在这种情况下ToString将不返回值,但这只是一个猜测。我还认为,您可能仍然希望有一个动态常数的能力,以便您可以确保值不会在静态构造函数之外更改,但直到运行时才知道类型。
另一种可能性,正如Servy指出的,是这样一个角落的情况,它不值得修复。