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

时间:2014-09-04 12:08:28

标签: c# dynamic

在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();解决了这个问题,但我想理解为什么它会发生。

2 个答案:

答案 0 :(得分:3)

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

例如,可能有另一种方法,如

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

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

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

答案 1 :(得分:0)

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