为什么动态调用返回动态结果?

时间:2010-10-22 13:25:43

标签: c# c#-4.0 language-design .net-4.0

public string Foo(object obj) {
    return null;
}

public string Foo(string str) {
    return null;
}

var x = Foo((dynamic) "abc");

为什么x动态,编译器不够智能或者我错过了重要的东西?

2 个答案:

答案 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