请检查以下代码段:
具体的计数器识别到 可计数 集合应该属于签名 int Count(IEnumerable),但非特定版本却不是这样。我得到了错误信息:
为什么它们的行为不同? 如何指定非特定版本以使其与其他版本行为相同? 注意: 我知道这个例子不现实。然而,在一个相当复杂的场景中,我遇到了这个问题与扩展方法。我使用这些类以简化说明。 谢谢您提前。
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>();
接下来,我想在集合上同时使用两个计数器类。
var specific = new Counter<CItem>();
var nonspecific = new Counter();
specific.Count(countables);
nonspecific.Count(countables);
具体的计数器识别到 可计数 集合应该属于签名 int Count(IEnumerable),但非特定版本却不是这样。我得到了错误信息:
看起来非特定版本使用了错误的集合签名。类型 '
System.Collections.Generic.List<CItem>
' 不能用作泛型类型或方法 'Counter.Count<T>(T)
' 中的类型参数 'T
'。没有从List<CItem>
到ICountable
的隐式引用转换。
为什么它们的行为不同? 如何指定非特定版本以使其与其他版本行为相同? 注意: 我知道这个例子不现实。然而,在一个相当复杂的场景中,我遇到了这个问题与扩展方法。我使用这些类以简化说明。 谢谢您提前。
nonspecific.Count<CItem>(countables);
这样的地方明确指定了泛型类型,那也是可以的。 - farid bekranIEnumerable<CItem> countables = new List<CItem>();
定义了countables
,则会选择正确的重载。 - SWeko