从泛型类派生的c#问题

蒂姆

以下是工薪阶层:

public class CatalogManager<T1, T2, T3> where T1 : CatalogDataEntryForm<DataEntryControl>, new()
                                        where T2 : CatalogDataGridForm<DataGridControl>, new()
                                        where T3 : CatalogBusinessObject
{
    public CatalogManager()
    {
        _DataGridFrom = new T2();
        InitGridformToolbarItemeEvents();
    }

}

public class BankDataEntryForm : CatalogDataEntryForm<BankDataEntryControl>
{
}

public class BankDataGridForm : CatalogDataGridForm<BankDataGridControl>
{
}

但是,下面的派生类抱怨错误:

public class BankManager : CatalogManager<BankDataEntryForm, BankDataGridForm, BankBo>
{
    public BankManager()
    {

    }
}

错误信息:

错误 CS0311 类型“BankDataEntryForm”不能用作泛型类型或方法“CatalogManager”中的类型参数“T1”。错误 CS0311 类型“BankDataGridForm”不能用作泛型类型或方法“CatalogManager”中的类型参数“T2”

非常感谢您的帮助。

问题是泛型中协方差和逆变,正如 SLaks 所说DataEntryControl的与 不同BankDataEntryControl,尽管它们是继承关系。

从 .NET Framework 4 开始,Visual Basic 和 C# 具有关键字,使您能够将接口和委托的泛型类型参数标记为协变或逆变。

所以你可以尝试为这些类制作接口。

  • ICatalogDataEntryForm<out T> 为了 CatalogDataEntryForm<T>
  • ICatalogDataGridForm<out T> 为了 CatalogDataGridForm<T>

然后让那些类实现接口

public interface ICatalogDataEntryForm<out T> 
{ }

public interface ICatalogDataGridForm<out T> 
{ }

public class CatalogDataEntryForm<T> : ICatalogDataEntryForm<T>
{ }
public class CatalogDataGridForm<T> : ICatalogDataGridForm<T>
{}

BankDataGridForm并且BankDataEntryForm无需更改。

public class BankDataGridForm : CatalogDataGridForm<BankDataGridControl>
{ 
}
public class BankDataEntryForm : CatalogDataEntryForm<BankDataEntryControl>
{
}

public class BankManager : CatalogManager<BankDataEntryForm, BankDataGridForm,CatalogBusinessObject>
{
    public BankManager()
    {

    }
}

然后让CatalogManager类与那些接口签约

public class CatalogManager<T1, T2, T3> where T1 : ICatalogDataEntryForm<DataEntryControl>, new()
                                       where T2 : ICatalogDataGridForm<DataGridControl>, new()
                                       where T3 : CatalogBusinessObject
{
    public CatalogManager()
    {

    }

}

c#在线

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

性能:从泛型派生的类型

来自分类Dev

获取作为基类传递给泛型方法的派生C#类的属性

来自分类Dev

C ++中的泛型类

来自分类Dev

C#中的嵌套泛型问题

来自分类Dev

用派生泛型类型的派生类实例调用方法

来自分类Dev

了解泛型的问题

来自分类Dev

泛型问题Java

来自分类Dev

C#泛型:修改派生类中隐藏的继承成员

来自分类Dev

在泛型派生的类的集合中使用泛型基类

来自分类Dev

如何从虚拟函数返回泛型派生类?

来自分类Dev

如果我从泛型类派生非泛型类,类型会怎样?

来自分类Dev

包含泛型成员的类数组出现问题

来自分类Dev

检查泛型参数类型是否从某个类X派生

来自分类Dev

如何确保派生自抽象泛型类的类将自身用作泛型参数

来自分类Dev

在C#中的基类中使用泛型:如何确保基类中的方法返回派生类的类型?

来自分类Dev

包含泛型成员的类数组出现问题

来自分类Dev

C ++:泛型类中的非泛型方法?

来自分类Dev

Java的泛型问题

来自分类Dev

C#派生泛型类型参数

来自分类Dev

泛型问题

来自分类Dev

C#泛型:修改派生类中隐藏的继承成员

来自分类Dev

在泛型派生的类的集合中使用泛型基类

来自分类Dev

从泛型类派生

来自分类Dev

泛型类的字段约束 - C#

来自分类Dev

使用 Autofac 解析泛型抽象类的所有派生类

来自分类Dev

泛型类的定义:类型边界问题

来自分类Dev

使用参数化类的 Java 泛型问题

来自分类Dev

泛型扩展某个类的问题

来自分类Dev

实例化从泛型类派生的类,该类在其构造函数中有参数