动态参数导致编译器认为方法返回值是动态的

36

如果我有一个动态参数,编译器似乎会放弃返回类型并将其视为动态的。

例如:

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

应该理解为

dynamic -> MethodResult 

但它认为它是:

dynamic -> dynamic

在签名中添加动态参数是否会完全阻止编译器知道返回值的类型,尽管返回值是强类型的?

1个回答

33

是的,dynamic 关键字会阻止编译器获取参数、属性或方法返回值的类型。您可以添加显式转换来解决这个问题,例如:

(MethodResult)IsValid(someObject));

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


5
请查看MSDN-使用动态类型以获取更多详细信息 - “如果方法调用中的一个或多个参数具有动态类型,或者方法调用的接收器是动态类型,则重载决议将在运行时而不是在编译时发生。” 因此,直到运行时才知道将调用哪个方法。 - Alexei Levenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接