2010-01-29 91 views
6

這裏是我的代碼通用接口

public interface ITranslator<E, R> 
{  
    E ToEntity<T>(R record); 
} 

class Gens : ITranslator<string, int> 
{ 
    #region ITranslator<string,int> Members 

    public string ToEntity<MyOtherClass>(int record) 
    { 
     return record.ToString(); 
    } 

    #endregion 
} 

當我編譯此,我得到一個錯誤Type parameter declaration must be an identifier not a type

,這是爲什麼我不能有ToEntity<MyOtherClass>,但只能有ToEntity<T>

編輯:MyOtherClass在做什麼?我在實體(POCOs相當於實體框架)和記錄(框架返回的對象)之間轉換多個表/類。所以我想用這個來做我的類特定的轉換

+2

@Ram,你需要告訴我們:'MyOtherClass'應該如何參與你的方法'Gens.ToEntity'?從代碼中看不出來。如果我們知道你的意圖,我們可以提供一些更有用的反饋。 –

回答

9

您的界面有一個通用的ToEntity<T>方法,您已將您的實現類Gens中的非通用方法設爲ToEntity<MyOtherClass>。 (A 通用方法可採取任何類型的參數,可能在T給予一定約束。你Gens類試圖只對類型參數MyOtherClass,這違背泛型的目的提供一種用於ToEntity的定義。)

在你的代碼示例中,目前還不清楚你的Gens類正在嘗試使用MyOtherClass類型;它當然不涉及ToEntity的邏輯。我們需要更多信息才能夠進一步指導您。

爲了說明,這裏就是你當前的ITranslator<E, R>界面提供的定義,用簡單的英語:

「我提供了一個機制,以R類型的任何記錄翻譯 到實體E型 ,這種機制取決於任何用戶指定的類型 T。「

Gens類,而另一方面,它目前的設計方式,「實現」像這樣上面的接口:

「我可以整數轉換成字符串 我提供錯覺允許 用戶指定一個類型來控制 如何進行這種轉換的,但 其實沒有選擇類型 的MyOtherClass類涉及 莫名其妙;這一切我可以說。」

從這兩個敘述中,很明顯,Gens是不是真的做什麼ITranslator<E, R>接口保證。即,它不願意爲其ToEntity方法接受用戶指定的類型。這就是爲什麼這個代碼不會爲你編譯的原因。

+1

非常好的清晰答案。這個類沒有真正實現這個接口。因此錯誤 – ram

1

這在LINQpad中爲我編譯好。也許你在某個地方有一個名爲E,R或T的類型?

啊我看你在做什麼......你有MyOtherClass定義爲一個類的地方,但你試圖用它作爲ToEntity中的類型參數。您希望MyOtherClass參與ToEntity的具體情況如何?

+0

在vs2008中失敗 – ram

+2

您粘貼的代碼本身實際上是有效的代碼,編譯良好。我不太清楚在你的例子中你打算如何處理MyOtherClass。 – Josh

2

您必須聲明一個泛型類型的約束。

public string ToEntity<T>(int record) where T : MyOtherClass