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

C# 动态参数使编译器认为方法返回是动态的,c#,c#-4.0,dynamictype,C#,C# 4.0,Dynamictype,如果我有一个动态参数,编译器似乎会放弃返回类型,认为它是动态的 例如: public MethodResult IsValid(object userLogin) { return new MethodResult(); } 你会认为: var isValidResult = IsValid(someObject()); 应读为 dynamic -> MethodResult 但它认为: dynamic -> dynamic 向签名添加动态参数是否会完全阻止编

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

例如:

public MethodResult IsValid(object userLogin)
{     
  return new MethodResult();
}
你会认为:

var isValidResult = IsValid(someObject());
应读为

dynamic -> MethodResult 
但它认为:

dynamic -> dynamic

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

是的,动态会阻止编译器知道任何参数、属性或方法返回类型的类型。添加显式强制转换,如:

(MethodResult)IsValid(someObject));
这里的原因是,一旦你进入C语言的动态世界,你将进入后期绑定。编译器无法验证此代码,因为它无法再使用任何静态类型分析。所以它推迟到以后。您可以通过提供静态强制转换作为编译器的指南来帮助克服这一问题。

有关更多详细信息,请检查-“如果方法调用中的一个或多个参数的类型为dynamic,或者如果方法调用的接收者的类型为dynamic,则重载解析将在运行时而不是在编译时发生。”-因此,直到运行时才知道将调用什么方法。