以下代码会生成异常:
未处理的异常:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法将类型'void'隐式转换为'object'
var m = M((dynamic)d); //Exception thrown here
private void M(Int32 n) { Console.WriteLine("M(Int32): " + n); }
我认为应该将null赋给m变量而不是异常。
有什么想法吗?
修改
请注意,下面会生成编译时错误
dynamic result = M(1);//compile time error: Cannot implicitly convert type 'void' to 'dynamic'
private void M(Int32 n) { }
答案 0 :(得分:2)
通常情况下,这样的问题会通过规范参考来回答,该参考显示编译器/运行时实际上正在做正确的事情。在这种情况下,规范(7.2.2)的相关部分相对安静。它基本上说确切的细节是特定于实现的。
但是,我认为它正在做正确的事情:如果你认为动态类型大致转换为让编译器以相同的方式运行,而是使用实际的类型的表达式作为它们在执行时,那么执行时间错误是完全合理的。调用void方法时的正常编译器行为是禁止将它用作赋值表达式的右侧,那么为什么要更改只是因为绑定是在执行时完成的?