为什么编译器在运行时异常不可避免的情况下让这个表达式编译?
我不认为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()
{
}
答案 0 :(得分:3)
测试((动态)“abc”)作为动态语句全部评估。更完整的是,你可以:
public static string Test(string s) { return s; }
这将是一个更好的重载,因此将优先于其他方法进行选择和执行。
或换句话说:如果不将方法组解析为特定签名,它无法知道返回是否为空。根据定义,的重载决策延迟到动态调用的运行时。
可以做更多分析吗?大概。但规范并不要求它,所以最绝对的可能是警告(而不是错误)。