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

C#动态绑定和void方法调用,c#,dynamic,dynamic-binding,C#,Dynamic,Dynamic Binding,为什么编译器让这个表达式编译,而运行时异常是不可避免的 我认为动态绑定不应该适用于void方法 static void Main(string[] args) { var res = Test((dynamic)"test"); // throws RuntimeBinderException exception at runtime } static void Test(dynamic args) { } 如果C#规范将上述表达式引用为动态绑定表达式,那么为什么不编译以下方法 s

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

我认为
动态绑定
不应该适用于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()
{
}
测试((动态)“abc”)作为动态语句进行整体评估。更全面地说,您可以:

public static string Test(string s) { return s; }
这将是一个更好的重载,因此将优先选择和执行其他方法

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


它能做更多的分析吗?可能但是规范并不要求它这样做,因此它最多可能是一个警告(而不是错误)。

基本上,当您将
动态
抛出池时,任何类型的编译时检查都会退出窗口。这就是重点。那么为什么第二个方法会抛出编译时异常呢?在第二种情况下,您知道它不会返回任何东西,在运行时没有任何东西可能会发生变化,使它返回某些东西。在第一种情况下,可能还有其他一些它还不知道的方法可以让它编译和运行。是的,关于第二种方法你是对的,但是第一种方法没有意义,因为编译器应该已经知道它不会返回任何东西,无论是在编译时还是在运行时!错。在运行时之前,它甚至不知道要调用什么方法,所以它不可能知道它没有选择的方法是否有返回值。