以下是工薪阶层:
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()
{
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句