请检查以下代码段:
public interface ICountable { }
public class Counter<T>
where T : ICountable
{
public int Count(IEnumerable<T> items)
{
return 0;
}
public int Count(T Item)
{
return 0;
}
}
public class Counter
{
public int Count<T>(IEnumerable<T> items)
where T : ICountable
{
return 0;
}
public int Count<T>(T Item)
where T : ICountable
{
return 0;
}
}
两个版本的 Counter 仅在泛型参数的规范上有所不同。其中一个定义为泛型类型参数,另一个定义为泛型参数。两者都限制方法参数以实现 ICountable 接口。我将分别称它们为特定的和非特定的。
现在,我正在定义一个实现ICountable接口的类和一个实例集合:
public class CItem : ICountable { }
var countables = new List<CItem>();
然后,我想在集合上使用这两个 Counter 类。
var specific = new Counter<CItem>();
var nonspecific = new Counter();
specific.Count(countables);
nonspecific.Count(countables);
特定计数器识别可计数集合应属于签名int Count(IEnumerable),但非特定版本则不会。我得到错误:
类型“
System.Collections.Generic.List<CItem>
”不能用作T
泛型类型或方法“ ”中的类型参数“Counter.Count<T>(T)
”。没有从List<CItem>
' 到 的隐式引用转换ICountable
。
似乎非特定版本对集合使用了错误的签名。
为什么他们的行为不同?如何指定非特定版本以使其行为与其他版本相同?
注意:我知道这个例子是不现实的。但是,我在扩展方法非常复杂的场景中遇到了这个问题。为了简单起见,我使用这些类
提前致谢