【问题标题】:c#, Problem with generic typesc#,泛型类型的问题
【发布时间】:2010-01-23 18:20:51
【问题描述】:

我有基类:

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

还有几个子类

class Producent : ARBase<Producent>
{
}

class Supplier : ARBase<Supplier>
{
}

现在在其他类中,我想拥有以下类型的属性:

public IList<ARBase<Object>> MyCollection 
{
}

并且希望能够分配供应商集合或生产者集合,但出现错误:无法将 List&lt;Producent&gt; 转换为 IList&lt;ARBase&lt;Object&gt;&gt;...

有人知道解决办法吗?

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    基本上,问题在于 .NET 泛型不支持这样的协变 - 在某些情况下支持,但仅适用于接口和委托,而 C# 仅在版本 4 中支持它。(IList&lt;T&gt; 仍然不支持.NET 4.0 中的变体,因为它在“输入”和“输出”意义上都使用了 T。)

    作为可能出错的示例,假设有人将 Supplier 添加到 Producers 的列表中 - 您不希望允许这样做,但在编译时无法阻止如果您可以将List&lt;Producer&gt; 转换为IList&lt;ARBase&lt;object&gt;&gt;

    您希望您的消费者能够使用您的财产做什么?这将建议如何进行。

    【讨论】:

    • 我正在尝试修改 treegridview 实现(从 ComponentFactory KryptonGridView 派生)以支持 IList 作为 DataSource(目前只有 DataTable)。我想传递给它 IList 或 IList 两者都派生自 ActiveRecordBase
    • 如果它只用于DataSource,那么您可以将其公开为非泛型IEnumerable,不是吗?它在口中留下不好的味道,但它会起作用。
    猜你喜欢
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多