通用接口的非泛型类实现不是继承的

时间:2013-09-27 18:16:46

标签: c# generics inheritance

如果我有这段代码:

public interface IThing<T> where T : class
{
    // ...
}

public class BaseThing<T> : IThing<T> where T : class
{
    // ...
}

public class ThingA : BaseThing<string>
{
    // ...
}

public class ThingB : BaseThing<Uri>
{
    // ...
}

此代码失败:

List<IThing<object>> thingList = new List<IThing<object>>();

thingList.Add(new ThingA());
thingList.Add(new ThingB());

即使ThingA(间接)继承自IThing<T>(也应该是其实例)。为什么? ThingA / ThingB不是IThing<T>的实例吗?

1 个答案:

答案 0 :(得分:7)

这将要求您的界面是协变的。有关详细信息,请参阅Covariance and Contravariance in Generics

在这种情况下,您可以使用以下方法完成此工作:

// Add out here
public interface IThing<out T> where T : class
{
}

请注意,这确实会对接口施加限制以及您可以使用它做什么,因为它要求接口中的类型T仅用作接口中的方法返回类型,而不是用作一种形式方法参数。

如果这不可行,另一个选择是创建一个非通用IThing接口,并IThing<T>实现IThing。然后,您可以使用List<IThing>进行收藏。