1

我有

 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;我可以创建一个只返回 (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 的类

这个故事可能还有更多,因为在声明中

NOTIFICATIONRECORDDataTable : global::System.Data.TypedTableBase<NOTIFICATION_RECORDRow>

工具提示说:

此类型用作 Visual Studio 和 XSD.exe .NET Framework 工具生成类型化 System.Data.DataTable 对象的基类,不打算直接从您的代码中使用。

事实上我不能在我的代码文件中声明

 public class B:System.Data.TypedTableBase<DataRow> {}

编辑 - 已解决

我无法声明,因为 TypedTableBase 在 system.data.datasetextensions 程序集中。

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

4

3 回答 3

1

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

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

于 2013-09-05T19:43:12.737 回答
0

我不能宣布

 class B:TypedTableBase<DataRow>{ }

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

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

谢谢大家。

于 2013-09-05T20:10:04.947 回答
0

由于 TypedTableBase 是通用的,所以当你使用它时,你必须指定实际的数据类型,如

public class A<T> where T:DataTable
   {

   }

    public class B :TypedTableBase<DataRow>
    {
    }

    class MyClass
    {
         A<B> asdf = new A<B>();
    }
于 2013-09-05T19:27:34.333 回答