在C#5中,当我尝试将动态作为方法参数传递时,结果由于某种原因变得动态。
class Program
{
static void Main(string[] args)
{
dynamic value = "John";
Find<int>(value).ToList();
}
public static IEnumerable<T> Find<T>(object value)
{
//SOME LOGIC
yield return default(T); //REAL RESULT
}
}
Find<T>(value)
必须返回IEnumerable<T>
。 为什么编译器认为它是动态的?
我知道Find<int>(val as object).ToList();
解决了这个问题,但我想理解为什么它会发生。
答案 0 :(得分:3)
因为可能有一个Find匹配另一个方法而不是Find在运行时,一旦你变得动态,一切都是动态的,包括解决哪个方法适合,所以一旦表达式中的某些东西是动态的,整个表达式就是动态的
例如,可能有另一种方法,如
public static T Find<T>(sometype value)
{
return default T;
}
如果动态实际上是sometype类型,那么在运行时这将是更好的匹配,因此只要编译器不知道动态是什么就不能推断返回类型,因为该类型可以是由返回类型返回的任何内容。匹配最佳AT RUNTIME的方法。
所以编译器说它返回动态,因为这是最好的选择,你的方法返回别的东西,但编译器还不知道该方法是否会被调用。
答案 1 :(得分:0)
dynamic在编译时是类型未知但在运行时。所以在运行时它可以是一个字符串类型,并且可能有一个更好的匹配,称为Find(字符串值),它返回一个不同的类型。这就是编译器无法告诉你的原因。它在运行时解决。