动态参数使编译器认为方法返回是动态的

Pro*_*ool 31 c# c#-4.0 dynamictype

如果我有一个动态参数,编译器似乎抛弃了返回类型并认为它是动态的.

例如:

public MethodResult IsValid(object userLogin)
{     
  return new MethodResult();
}
Run Code Online (Sandbox Code Playgroud)

你会认为:

var isValidResult = IsValid(someObject());
Run Code Online (Sandbox Code Playgroud)

应该读作

dynamic -> MethodResult 
Run Code Online (Sandbox Code Playgroud)

但它认为它是:

dynamic -> dynamic
Run Code Online (Sandbox Code Playgroud)

为签名添加动态参数是否完全阻止编译器知道返回应该是什么,尽管返回是强类型的?

Jos*_*ers 28

是的,dynamic阻止编译器知道任何参数,属性或方法返回类型的类型.添加一个显式的强制类似:

(MethodResult)IsValid(someObject));
Run Code Online (Sandbox Code Playgroud)

这里的原因是,一旦你进入C#的动态世界,你就会进入后期绑定.编译器无法验证此代码,因为它无法再使用任何静态类型分析.所以它推迟到以后.您可以通过提供静态强制转换作为编译器的指南来帮助解决这个问题.

  • 有关详细信息,请查看[MSDN - 使用动态类型](http://msdn.microsoft.com/en-us/library/dd264736.aspx) - "重载解析在运行时发生,而不是在编译时发生,如果一个或多个方法调用中的参数具有动态类型,或者方法调用的接收者是动态类型." - 因此,直到运行时才会知道将要调用哪种方法. (3认同)