C#,泛型类型问题

3

我有一个基础类:

class ARBase<T> : ActiveRecordValidationBase<T> where T : class
{
}

还有几个子类

class Producent : ARBase<Producent>
{
}

class Supplier : ARBase<Supplier>
{
}

现在在另一个类中,我想要一个类型为的属性:

public IList<ARBase<Object>> MyCollection 
{
}

我想能够分配供应商集合或生产者集合,但是我收到了错误信息:无法将List<Producent>强制转换为IList<ARBase<Object>>...

有人知道解决方案吗?

1个回答

3
基本上问题在于.NET泛型不支持这样的协变性——在某些情况下有支持,但仅适用于接口和委托,并且只有C# 4版本才支持。(在.NET 4.0中,IList仍然不是变体,因为它在“in”和“out”方面都使用T。)
假设将Supplier添加到Producer列表中,你不希望这样做,但如果可以将List转换为IList>,则无法在编译时阻止它发生。
你希望你的消费者能够通过属性做什么?这会建议如何继续。

我正在尝试修改treegridview实现(派生自ComponentFactory KryptonGridView),以支持IList<T>作为DataSource(目前仅支持DataTable)。我想将IList<Producent>或IList<Supplier>传递给它,两者都派生自ActiveRecordBase<T>类。 - Adrian Serafin
如果只是为了 DataSource,那么你可以将其公开为非泛型的 IEnumerable,不是吗?虽然这样做让人感觉不太好,但它确实可行。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接