我读了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-Collection
和Not-Collection
。
答案 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!");
}