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