如何投射此通用界面?

时间:2009-09-10 19:41:34

标签: c# generics casting

我定义了以下类来进行验证:

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);

有什么想法吗?

2 个答案:

答案 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;