方法重载和泛型参数

时间:2015-08-06 04:37:56

标签: c# generics overloading

我读了this question,我正在尝试做类似的事情:

static class ExtentionMethods
{
    static public void MyReset<T>(this T col)
    {
        Console.WriteLine("Not a collection!");
    }

    static public void MyReset<T, U>(this T col) where T : ICollection<U>
    {
        col.Clear();
        Console.WriteLine("Cleared!");
    }

    // and maybe more overload for T : IWhatevetInterface<U>
}

这样List<T>和任何实现ICollection<T>的人都会选择第二种方法,而MyClass(MyClass只是一些没有实现ICollection的类)当然会选择第一种方法,因为例如:

List<int> list1 = new List<int>();
list1.MyReset<List<int>, int>(); // "Cleared!"
MyClass x = new MyClass(); 
x.MyReset(); // "Not a collection!"

一切正常,但问题是,我怎样才能避免为<List<int>, int>list1.MyReset<List<int>, int>()?我只想写list1.MyReset()

目标是保持区分ICollection<T>和其他类的能力,但也不要明确提供通用参数。

回复评论:我计划添加更多重载,因此案例不仅仅是Yes-CollectionNot-Collection

1 个答案:

答案 0 :(得分:4)

C#在其类型推理算法中不使用泛型约束。

但是,看起来你实际上并不需要类型约束。您可以像这样简化代码,这确实有效:

static public void MyReset(this object col)
{
    Console.WriteLine("Not a collection!");
}

static public void MyReset<T>(this ICollection<T> col)
{
    col.Clear();
    Console.WriteLine("Cleared!");
}

static public void MyReset<T>(this IWhateverYouLike<T> col)
{
    col.ClearItIfYouLike();
    Console.WriteLine("Cleared!");
}