将dynamic传递给方法时,结果是动态表达式,即使它不是

在C#5中,当我尝试将动态作为方法参数传递时,由于某种原因,结果变为动态。

class Program { static void Main(string[] args) { dynamic value = "John"; Find(value).ToList(); } public static IEnumerable Find(object value) { //SOME LOGIC yield return default(T); //REAL RESULT } } 

Find(value)必须返回IEnumerable为什么编译器认为它是动态的?
我知道Find(val as object).ToList(); 解决这个问题,但我想了解为什么会发生这种情况。

因为可能有一个Find与另一个方法匹配而不是Find在运行时,一旦你变得动态,一切都是动态的,包括解决哪个方法适合,所以一旦表达式中的某些东西是动态的,整个表达式就是动态的。

例如,可能有另一种方法

 public static T Find(sometype value) { return default T; } 

如果动态实际上是sometype类型,那么这在运行时会更好地匹配,所以只要编译器不知道动态是什么就不能推断返回类型,因为该类型可以是匹配方法返回的任何类型最好的运行时间。

所以编译器说它返回动态,因为这是最好的选择,你的方法返回别的东西,但编译器还不知道该方法是否会被调用。

dynamic在编译时是类型未知但在运行时。 所以在运行时它可以是一个字符串类型,并且可能有一个更好的匹配,称为Find(字符串值),它返回不同的类型。 这就是编译器无法告诉你的原因。 它在运行时解决。