我定义了以下类来进行验证:
public class DefValidator : IValidate<IDef>
{
}
public interface IDef : IAttribute
{
}
然后,我有一个如下定义的验证器列表:
IList<IValidate<IAttribute>> ValidationObjects;
当我尝试以下操作时,它不会编译说它无法转换类型。
DefValidator defv = new DefValidator();
ValidationObjects.Add(defv);
当我尝试以下操作时,它会编译但会生成一个异常,说“无法投射对象”。
ValidationObjects.Add((IValidate<IAttribute>)defv);
有什么想法吗?
答案 0 :(得分:5)
您的问题与协方差/逆变有关,请参阅How is Generic Covariance & Contra-variance Implemented in C# 4.0?
答案 1 :(得分:1)
这是一个与泛型中的co和contra-variance有关的微妙问题;在SO上有许多更简单的例子。从本质上讲,泛型中的类型必须完全匹配才能兼容,它们不能是子类或超类。
要使其编译,ValidationObjects需要是IList&lt; IValidate&lt; IDef&gt;&gt;,或者DefValidator需要继承IValidate&lt; IAttribute&gt;