Func <t,tresult>不是Func <t,tresult>

时间:2015-12-05 11:02:53

标签: c# reflection lambda

我尝试比较两种类型定义。一个定义是Func<,>。另一个是Func<T,TResults>的通用定义,我认为它也应该是Func<,>

比较返回false:

using System;
using System.Reflection;

namespace ConsoleApplication4
{
    public class Program
    {
        static Func<T, TResult> get_f2<T, TResult>()
        {
            return input => default(TResult);
        }
        static void Main(string[] args)
        {
            Func<int, int> f1 = x => 2 * x;
            Type f1_def = f1.GetType().GetGenericTypeDefinition();

            MethodInfo f2_maker = typeof(Program).GetMethod("get_f2", BindingFlags.NonPublic | BindingFlags.Static);
            Type f2_def = f2_maker.ReturnType;

            Console.WriteLine(f1_def.ToString() + " " + f2_def.ToString() + " " + (f1_def == f2_def).ToString());
            Console.ReadLine();
        }
    }
}

我用.net 4.5编译了它。

结果是

System.Func`2[T,TResult] System.Func`2[T,TResult] False

1 个答案:

答案 0 :(得分:2)

您的f1_def打印为System.Func`2[T,TResult],因为它是通用类型定义,而Func<,>只是如何命名其类型参数。

您的f2_def打印为System.Func`2[T,TResult],因为它不是通用类型定义Func<,>,但它实际上放在您的方法。事情变得混乱,因为Func<,>的泛型类型参数与您的方法的泛型类型参数具有相同的名称。

您应该能够通过将方法的通用类型参数名称更改为AB来更清楚地看到差异。