无法声明具有类型参数的实例,该实例是类型参数约束之外的一层

时间:2013-09-05 19:19:49

标签: c# generics inheritance

我有

 class A<T> where T:DataTable{}

 class B:TypedTableBase<S>{}

System.Data.TypedTableBase扩展了DataTable,但我无法声明

 private A<B> a;

编译器抱怨B和DataTable之间不存在隐式转换,但B扩展了扩展DataTable的TypedTableBase。

我不明白这个,有人可以解释一下吗?有没有办法实现我想要的?即,声明私人A a; 我可以创建一个只返回(DataTable)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;
}

编辑 - 延长TYPEDTABLEBASE的CANT DECLARE类

故事可能还有更多内容,因为在

的声明中
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程序集中。

现在一切都很好。 谢谢大家!

3 个答案:

答案 0 :(得分:1)

问题是你的类型参数不匹配。拆分线,它变得更加明显:

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 - 我们不知道你的意思)那么它应该没问题。

答案 1 :(得分:0)

由于TypedTableBase是通用的,因此在使用它时,必须指定实际的数据类型 如在

public class A<T> where T:DataTable
   {

   }

    public class B :TypedTableBase<DataRow>
    {
    }

    class MyClass
    {
         A<B> asdf = new A<B>();
    }

答案 2 :(得分:0)

我无法宣布

 class B:TypedTableBase<DataRow>{ }

因为我缺少程序集System.Data.DataSetExtensions

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

感谢所有人。