为什么c#中动态表达式的周围类型不能静态解析?
本文关键字:静态 不能 类型 周围 动态 表达式 为什么 | 更新日期: 2023-09-27 18:01:18
在动态表达式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