不能声明具有类型参数的实例,该参数与类型参数的约束相距一层

本文关键字:类型参数 一层 约束 参数 声明 实例 不能 | 更新日期: 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_RECORDDataTableFD.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>{ }

因为我缺少程序集系统.数据.数据集扩展

现在一切都很好 - 这不是间接继承问题。

谢谢大家。