2013-05-13 155 views
0

下面的代碼...如何在泛型類聲明中使用泛型?

class Repository<T> where T : Func<TIn, TOut> 
{ 
//... 
} 

導致VS抱怨「的類型或命名空間名稱‘錫’/‘吹捧’不能被發現。」

有沒有辦法做到這一點?

+0

你不能約束一個類型'T'到'Func鍵'因爲你canonly約束類型接口,非密封類或類型。 – 2013-05-13 11:57:40

+0

Func 是一種類型 – Kenneth 2013-05-13 11:59:46

+0

@Kenneth對不起,應該說「類型參數」不只是「類型」 – 2013-05-13 12:04:49

回答

3

如果Func本身是一個通用類,然後是你可以通過:

class Repository<T, TIn, TOut> where T: Func<TIn, TOut> 

但是,你不能用Func做到這一點,因爲它只能通過一個接口/非密封類受到約束或一個類型參數。

作爲替代方案,你可以通過Func在構造函數參數,它工作即

class Repository<TIn, TOut> 
{ 
    public Repository(Func<TIn, TOut> func) 
    { 
     ... 
    } 
} 

不是真的知道這會給你你雖然之後在做什麼。

0

您必須在類的定義指定TInTOut的「投入」,否則,編譯器不會從那裏拿了那

class Repository<T, TIn, TOut> where T : Func<TIn, TOut> 
{ 
    //... 
} 
0

你不能約束一個類型弄清楚T到Func,因爲你只能將類型約束到接口,非密封類或類型參數。

如果可以做到這一點,就應該是這樣的:

class Repository<T, TIn, Tout> where T: Func<TIn, TOut> 
{ 
    //... 
} 

但你不能約束到Func<>,所以整個事情是註定的。

從編譯器中的錯誤信息是:

錯誤1 'System.Func' 是不是一個有效約束。用作約束的類型必須是接口,非密封類或類型參數。

1

由於您已經知道您想要的類型,因此不需要對其進行約束。 我想你想要的是這樣的:

class Repository<TIn, TOut> 
{ 
    public void someMethod(Func<TIn, TOut> func) 
    { 

    } 
} 
+0

這看起來像答案。 – 2013-05-13 12:19:19