2012-03-18 69 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: ^^^ 

但是!不要使用靜態數據上下文:

  • 它不會是線程安全的
  • 這將意味着你的數據上下文隨時間增長(這意味着是工作單位,不是一個應用終身對象)