为什么c#中动态表达式的周围类型不能静态解析?



在动态表达式dynamic x中,是否有原因/解释为什么周围的表达式(例如foo(x))也是动态的?

考虑:

static string foo(object x) { }
static void Main()
{
  dynamic x = null;
  foo(x);  // foo(x) is a dynamic expression
}

我假设编译器可以解析(在编译时)foo(object)被调用。但是,将鼠标悬停在foo(x)上显示该类型是动态的。

我可以通过指定

来帮助编译器进行推断
foo((object)x);

但是我认为dynamic表达式的类型是object

c#参考确实说"包含动态类型表达式的操作不被解析",我的问题是:

是否有原因阻止编译器解析"外部"/周围表达式的类型?

参考

在大多数情况下,

Type dynamic的行为类似于Type object。但是,编译器不会解析或检查包含动态类型表达式的操作。编译器将有关操作的信息打包在一起,这些信息稍后用于在运行时计算操作。作为这个过程的一部分,动态类型的变量被编译成对象类型的变量。因此,动态类型只存在于编译时,而不存在于运行时。

https://msdn.microsoft.com/en-us/library/dd264741.aspx

假设你有

static string foo(object x) { return "bar"; }
static string foo(string x) { return "foo"; }
static void Main()
{
  dynamic x = null;
  foo(x);  // foo(x) is a dynamic expression
}

在这种情况下,编译器将无法解析表达式的类型。虽然我认为在你的例子中,类型应该是可解析的,但它不会在最有用的情况下,使该特性的实现成本相当低。

此外,DLR不能像您的示例那样对空引用执行任何绑定。

这背后的原因是动态类型不能与编译器一起工作,但它们可以在DLR中解决。编译器没有办法知道你的动态将被解析成什么类型…这就是为什么任何与dynamic相关的内容都只能在运行时解析。

关于DLR的更多信息:https://msdn.microsoft.com/en-us/library/dd233052.aspx

相关内容

最新更新