C#动态绑定和void方法调用

时间:2012-12-12 17:56:52

标签: c# dynamic dynamic-binding

为什么编译器在运行时异常不可避免的情况下让这个表达式编译?

我不认为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()
{
}

1 个答案:

答案 0 :(得分:3)

测试((动态)“abc”)作为动态语句全部评估。更完整的是,你可以:

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

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

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

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