2012-02-13 67 views
2

考慮下面的類層次結構:協方差,逆變和消除多餘的類型參數

abstract class A { } 
abstract class B { } 
abstract class C { } 
abstract class D<TA, TB, TC> 
    where TA : A 
    where TB : B 
    where TC : C { } 

class E : A { } 
class F : B { } 
class G : C { } 
class H : D<E, F, G> { } 

我想創建一個簡單的通用方法實例D類型的對象:

void Create<TD>(string description) 
    where TD : D 
{ 
    var instance = Activator.CreateInstance<TD>(); 
} 

但是,編譯強制指定D的類型參數,因此我必須編寫以下內容:

void Create<TD, TA, TB, TC>(string description) 
    where TA : A 
    where TB : B 
    where TC : C 
    where TD : D<TA, TB, TC> 
{ 
    var instance = Activator.CreateInstance<D>(); 
} 

這意味着,不是能寫

Create<H>("foo"); 

我必須寫

Create<H, E, F, G>("foo"); 

我的問題是:因爲我指定H作爲具體實例,爲什麼需要編譯器方法簽名上的基類D的附加類型參數?爲什麼不能簡單地從H推斷那些?

+0

你期望能夠說'where TL:List'是什麼意思?'TL'是一些關閉的'List <>',但我不在乎哪一個? – AakashM 2012-02-13 15:16:44

回答

2

where TD : D意味着D不是通用的,其中TD : D<TA, TB, TC>暗示D是通用的。