Yas*_*adi 0 c# generics reflection
看看下面的代码:
为什么result1有2个通用参数?
public class Program
{
public static void Main(string[] args)
{
IEnumerable<Test> result1 = Test1();
Console.WriteLine(result1.GetType().GetGenericArguments().Count()); // 2
IEnumerable<Test> result2 = Test2();
Console.WriteLine(result2.GetType().GetGenericArguments().Count()); // 1
}
public static IEnumerable<Test> Test1()
{
return new Test[] { }.Where(t => t.Id > 1).Select(t =>
{
t.Id++;
return t;
});
}
public static IEnumerable<Test> Test2()
{
return new Test[] { }.Where(t => t.Id > 1);
}
}
public class Test
{
public virtual int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是因为从Test1返回的是WhereSelectArrayIterator的一个实例,它接受两个通用参数,一个源类型和一个结果类型.即class WhereSelectArrayIterator<TSource, TResult>或参见参考源.
但是,类本身实现了IEnumerable <TResult>,它允许将它分配给您的变量.您所犯的错误是将可分配类型(IEnumerable <Test>)与实现类型(WhereSelectArrayInterator)混淆.当你只有一个where语句时,只有一个泛型类型,因为它不会将类型从源转换为结果.
在这种情况下,打印类型的名称将给你答案.