在 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
}
}
Run Code Online (Sandbox Code Playgroud)
Find<T>(value)必须返回IEnumerable<T>。为什么编译器认为它是动态的?
我知道这Find<int>(val as object).ToList();可以解决这个问题,但我想了解它为什么会发生。
因为在运行时可能有一个 Find 匹配另一个方法而不是你的 Find,一旦你进入动态,一切都是动态的,包括解决哪个方法适合,所以只要表达式中的某些东西是动态的,整个表达式就是动态的。
例如,可能有另一种方法,如
public static T Find<T>(sometype value)
{
return default T;
}
Run Code Online (Sandbox Code Playgroud)
如果动态实际上是某种类型的类型,这将在运行时更好地匹配,因此只要编译器不知道动态是什么,它就无法推断返回类型,因为该类型可以是匹配的方法返回的任何内容最好在运行时。
所以编译器说它返回动态,因为这是最好的选择,你的方法返回别的东西,但编译器还不知道那个方法是否会被调用。