使用泛型方法键入推断

时间:2011-06-21 13:37:33

标签: c#-4.0

这是代码

class Program
{
    public static bool IsGreaterThan<T>(T x, T y) where T : IComparable<T>
    {
        return (x.CompareTo(y) > 0);
    }

    static void Main(string[] args)
    {
        var result = IsGreaterThan(20,10);
        Console.WriteLine(result); 
    }

}

只要看到调用像IsGreaterThan(20,10);这样的泛型方法,那么输入INT就不会传递......那么它是如何工作的呢?他们应该像IsGreaterThan<int>(20,10)

那样称呼它

如果方法签名就像public static bool IsGreaterThan<INT>(T x, T y) where T : IComparable<T>那么,如果我们调用方法而不指定像IsGreaterThan(20,10)这样的类型,那么它是否有效;这条路? ....感谢

2 个答案:

答案 0 :(得分:1)

您可以省略type参数,编译器会推断它。

类型推断的相同规则适用于静态方法和实例方法。编译器能够根据您传入的方法参数推断类型参数;它不能仅仅从约束或返回值推断类型参数。因此,类型推断不适用于没有参数的方法。类型推断在编译器尝试解析任何重载方法签名之前的编译时发生。编译器将类型推断逻辑应用于共享相同名称的所有通用方法。在重载解析步骤中,编译器仅包括那些类型推断成功的泛型方法。

http://msdn.microsoft.com/en-us/library/twcad0zb(v=vs.80).aspx

答案 1 :(得分:1)

你应该声明像这样的方法

public static bool IsGreaterThan<T>(T x, T y) where T : IComparable { return (x.CompareTo(y) > 0);}

否则您将收到编译错误“非泛型声明中不允许出现约束”

要调用该方法,您可以传递类型

    var result = IsGreaterThan<int>(20, 10);
    Console.WriteLine(result);

如果参数属于同一类型,则可以在调用时忽略Type int。如Jon所解释的,编译器会处理类型解析器