不能声明具有类型参数的实例,该参数与类型参数的约束相距一层
本文关键字:类型参数 一层 约束 参数 声明 实例 不能 | 更新日期: 2023-09-27 18:30:30
我有
class A<T> where T:DataTable{}
和
class B:TypedTableBase<S>{}
System.Data.TypedTableBase 扩展了 DataTable,但我无法声明
private A<B> a;
编译器抱怨 B 和 DataTable 之间不存在隐式转换,但 B 扩展了 TypedTableBase,从而扩展了 DataTable。
我不明白这一点,有人可以解释一下吗?有没有办法实现我想要的?即,声明私有 A a;我可以创建一个只返回 (数据表)b 的隐式转换运算符吗?
编辑 - 短代码示例
跟
public partial class NOTIFICATION_RECORDDataTable : global::System.Data.TypedTableBase<NOTIFICATION_RECORDRow> { ... }
和
public class CachedSortableDataSource<T>:ICachedSortableDataSource where T:DataTable {...}
A 是 CachedSortableDataSource;B 是NOTIFICATION_RECORDDataTable。
private void InitializeSortableDataGrid()
{
//following line wont compile:
CachedSortableDataSource<Data.FD.NOTIFICATION_RECORDDataTable> ds = new CachedSortableDataSource<FD.DataAccess.FD.NOTIFICATION_RECORDDataTable>();
ds.Adapter = new Data.FDTableAdapters.NOTIFICATION_RECORDTableAdapter();
ds.Cache("220");
sortableDataGrid1.CachedSortableData = ds;
}
编辑 - 无法声明扩展类型表库的类
这个故事可能还有更多,因为在声明中
NOTIFICATIONRECORDDataTable : global::System.Data.TypedTableBase<NOTIFICATION_RECORDRow>
工具提示显示:
此类型用作 Visual Studio 和 XSD.exe .NET Framework 工具生成的 typed-System.Data.DataTable 对象的基类,不应直接在代码中使用。
事实上,我无法在我的代码文件中声明
public class B:System.Data.TypedTableBase<DataRow> {}
编辑 - 已解决
我无法声明,因为TypedTableBase位于system.data.datasetextensions程序集中。
现在一切都很好。谢谢大家!
问题是你的类型参数不匹配。将线路拆分,它变得更加明显:
CachedSortableDataSource<Data.FD.NOTIFICATION_RECORDDataTable> ds = new
CachedSortableDataSource<FD.DataAccess.FD.NOTIFICATION_RECORDDataTable>();
Data.FD.NOTIFICATION_RECORDDataTable
与FD.DataAccess.FD.NOTIFICATION_RECORDDataTable
的类型不同。
如果您成功了:
CachedSortableDataSource<Data.FD.NOTIFICATION_RECORDDataTable> ds = new
CachedSortableDataSource<Data.FD.NOTIFICATION_RECORDDataTable>();
(或者也许使用 FD.DataAccess.FD.NOTIFICATION_RECORDDataTable
- 我们不知道你的意思)那么它应该没问题。
由于TypedTableBase是泛型的,因此在使用它时,必须指定实际的数据类型如
public class A<T> where T:DataTable
{
}
public class B :TypedTableBase<DataRow>
{
}
class MyClass
{
A<B> asdf = new A<B>();
}
我无法声明
class B:TypedTableBase<DataRow>{ }
因为我缺少程序集系统.数据.数据集扩展
现在一切都很好 - 这不是间接继承问题。
谢谢大家。