2012-03-18 71 views
2

如何指定该类型应该是从Interface继承的类?我尝试过各种变体,但没有意义。如何指定泛型约束:从接口继承的类?

public class CarDal<TCarMark> where TCarMark:class//also tried ICarMark 
{ 
    ... 
    private static readonly DataContext Context = new DataContext(ConnectionString); 
    private Table<ICarMark> _tblCarMarks = Context.GetTable<TCarMark>();//Error is "Cannot convert source type 'Table<TCarMark> to target type Table<ICarMark>'" 
    ... 
} 
+1

顺便说一句,一个静态的数据上下文是一个真的很糟糕的主意 – 2012-03-18 09:35:07

+0

好吧,我会考虑,但你能解释为什么吗? (提供链接或简短评论)谢谢。 – Yara 2012-03-18 09:38:51

+0

补充说,我的答案;这**会导致巨大的问题 – 2012-03-18 09:47:36

回答

5

你的约束,特别是结合你举两种形式,是罚款:

where TCarMark : class, ICarMark 

问题是方差。

一个Table<TCarMark>有一个Table<ICarMark>

没有协变/逆变关系时,必须使用Table<TCarMark> throught这个类:

private Table<TCarMark> _tblCarMarks = Context.GetTable<TCarMark>(); 
// emphasis: ^^^ 

但是!不要使用静态数据上下文:

  • 它不会是线程安全的
  • 这将意味着你的数据上下文随时间增长(这意味着是工作单位,不是一个应用终身对象)