public string Foo(object obj) {
return null;
}
public string Foo(string str) {
return null;
}
var x = Foo((dynamic) "abc");
为什么x动态,编译器不够智能或者我错过了重要的东西?
答案 0 :(得分:4)
我只是猜测,但......
向dynamic
添加强制转换时,整个表达式将成为动态表达式。动态表达式的结果始终为dynamic
,因为所有内容都在运行时解析。
使用dynamic
查看MSDN页面以获取更多信息:
Using Type dynamic (C# Programming Guide)
滚动到以下文字:
大多数动态操作的结果本身就是动态的。
答案 1 :(得分:3)
此博文可能对您有所帮助: http://blogs.msdn.com/b/cburrows/archive/2010/04/01/errata-dynamic-conversions-and-overload-resolution.aspx
特别是: “如果您使用动态参数进行方法调用,则会动态调度,周期。”
这意味着C#不知道在运行时调用哪个重载。它在编译时不知道。我的理解是它甚至没有检查编译时可能的重载是什么(为什么会这样?),或者记下在你的情况下它们都返回字符串这一事实。
所以在编译时,Foo
的返回值是未知的。因此,x
的类型在编译时确定为dynamic
。