为什么IsGenericType的结果在这些示例中有所不同?

LmT*_*oon 2 c# generics

我有函数,它生成char对象的集合:

public static IEnumerable<char> generic_foo<T>()
{
    return "1231";
}
public static IEnumerable<char> generic_foo2<T>()
{
    yield return '1';
    yield return '2';
    yield return '3';
}
public static IEnumerable<char> foo()
{
    return "1231";
}
public static IEnumerable<char> foo2()
{
    yield return '1';
    yield return '2';
    yield return '3';
}

public static void Main()
{
    var res = foo().GetType().IsGenericType;  //  False
    var gen_res = generic_foo<int>().GetType().IsGenericType;  //  False

    var res2 = foo2().GetType().IsGenericType;  //  False
    var gen_res2 = generic_foo2<int>().GetType().IsGenericType;  //  True
}
Run Code Online (Sandbox Code Playgroud)

我对程序的结果感到疑惑.为什么结果不同?foo2/generic_foo2方法之间的主要区别是什么?

Jon*_*eet 7

generic_foo2()由编译器通过状态机实现.这状态机将是通用的T所以调用-即使你没有真正使用它GetType()的状态机的实例将给出一个泛型类型.编译器注意到你从未真正使用T和创建非通用状态机是不值得的......这是一个罕见的极端情况.(为什么你要使方法通用,不要在任何地方使用类型参数?)

为其创建的状态机foo2()不需要是通用的,因为该方法本身不是通用的.

generic_foo()并且foo只是返回字符串,并且System.String绝对不是通用类型.