【问题标题】:Why is the surrounding type of a dynamic expression not statically resolved in C#?为什么动态表达式的周围类型在 C# 中没有静态解析?
【发布时间】:2015-07-07 11:19:38
【问题描述】:

在动态表达式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# 参考确实说“包含动态类型表达式的操作未解析”,我的问题是:

是否存在阻止编译器解析“外部”/周围表达式类型的原因?

参考

在大多数情况下,动态类型的行为类似于类型对象。但是,包含动态类型表达式的操作不会被编译器解析或类型检查。编译器将有关操作的信息打包在一起,这些信息稍后用于在运行时评估操作。作为该过程的一部分,动态类型的变量被编译为对象类型的变量。因此,动态类型只存在于编译时,而不存在于运行时。

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

【问题讨论】:

标签: c#


【解决方案1】:

假设你有

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 不能像您的示例中那样对空引用执行任何绑定。

【讨论】:

    【解决方案2】:

    这背后的原因是动态类型不适用于编译器,但它们在 DLR 中被解析。编译器无法知道您的动态将被解析为哪种类型......这就是为什么任何使用动态的东西都只能在运行时解析。

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

    【讨论】:

      猜你喜欢
      • 2014-09-27
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 2020-09-28
      • 2011-05-20
      • 1970-01-01
      相关资源
      最近更新 更多