1

为什么编译器让这个表达式编译而运行时异常是不可避免的?

我不认为Dynamic Binding应该适用于 void 方法

static void Main(string[] args)
{
    var res = Test((dynamic)"test");  // throws RuntimeBinderException exception at runtime
}

static void Test(dynamic args)
{
}

如果 C# 规范将上述表达式称为动态绑定表达式,为什么以下方法不能编译?

static dynamic DynamicMethod()
{
}
4

1 回答 1

3

Test((dynamic)"abc") 作为动态语句被整体评估。更完整地说,您可以:

public static string Test(string s) { return s; }

这将是一个更好的重载,因此将优先选择和执行其他方法。

或者换句话说:如果不将方法组解析为特定签名,它就无法知道返回是否无效。并且根据定义,重载决议被推迟到动态调用的运行时。

它可以做更多的分析吗?大概。但是规范并不要求它,所以它最多可能是一个警告(而不是错误)。

于 2012-12-12T18:27:53.623 回答