在c#中返回void的方法的动态类型参数

时间:2011-09-10 22:35:00

标签: c#-4.0

以下代码会生成异常:

未处理的异常: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) { } 

1 个答案:

答案 0 :(得分:2)

通常情况下,这样的问题会通过规范参考来回答,该参考显示编译器/运行时实际上正在做正确的事情。在这种情况下,规范(7.2.2)的相关部分相对安静。它基本上说确切的细节是特定于实现的。

但是,我认为它正在做正确的事情:如果你认为动态类型大致转换为让编译器以相同的方式运行,而是使用实际的类型的表达式作为它们在执行时,那么执行时间错误是完全合理的。调用void方法时的正常编译器行为是禁止将它用作赋值表达式的右侧,那么为什么要更改只是因为绑定是在执行时完成的?