我正在实现一个流畅的构建器模式,该模式需要在静态扩展方法中接受可枚举并迭代其内容,同时将仿函数应用于可枚举的内容。如(不是实际代码,只是一个说明):
public static IValidator<IEnumerable<T>> Each<T>(
this IValidator<IEnumerable<T>> enumerable,
Func<T, bool> action)
{
foreach (T value in enumerable)
action(value);
return validator;
}
这对于可枚举对象非常有效,但对于继承的类型/接口却失败了。比方说:
IValidator<IEnumerable<Guid>> validator = ...;
IEnumerable<Guid> guids = ...;
validator.Each(guids, guid => guid != Guid.Empty); // ok
IList<Guid> guids = ...;
validator.Each(guids, guid => guid != Guid.Empty); // doesn't compile (see below)
例外是:
IValidator<IList<Guid>>
不包含“Each”的定义,并且找不到接受第一个类型参数的扩展方法“Each”IValidator<IList<Guid>>
(您是否缺少 using 指令或程序集引用?
我的问题是关于继承链IValidator<T>
,更具体地说,是关于它的泛型类型 arguments T
。为什么 typeIValidator<IEnumerable<T>>
不能分配 from IValidator<IList<T>>
?我想不出哪种IList<T>
情况不是IEnumerable<T>
(给定相同的T
)。
将泛型参数约束为T : IEnumerable<R>
确实有效,但这需要两个类型参数(T
和R
),如果可能的话,我想避免。
有什么想法吗?更好的解决方案?谢谢。