2016-11-23 183 views
0

我已經創建這個通用方法類型「」不能被用作類型參數「在通用類型或方法T」

public IEnumerable<T> GetByID<T>(IEnumerable<T> source, int id) where T : IFields 
{ 
    return source.Where(x => x.id == id); 
} 

其中IFieds接口是

public interface IFields 
{ 
    string code { get; set; } 
    int id { get; set; } 
} 

當我嘗試得到的值,這顯然不會編譯

DB.GetByID(Helper.Database.Table<Items>(), 1); 

與以下編譯錯誤。

類型「項目」不能在通用 類型或方法 「DB.GetByID(System.Collections.Generic.IEnumerable,INT)」被用作類型參數「T」。有 是沒有從「項目」到「IFields」的隱含參考轉換

我該如何解決這個問題? 其實,我希望使用lambda表達式「以匿名類型」。

+3

'Items'是否實現'IFields'? –

+0

@ LasseV.Karlsen其實沒有先生 – OrElse

+2

那麼你預計會發生什麼?你特別說'T'必須實現那個接口,然後你嘗試傳入一個沒有的類型。我可以發佈一個簡單的答案,告訴你爲什麼你會得到這個錯誤消息,但我懷疑這不會幫你。請告訴我們更多關於你爲什麼添加了約束的問題,以及爲什麼/當你傳入一個沒有實現它的類型時會發生什麼,或許我們可以幫助你做正確的事情,而不僅僅是說「這就是爲什麼贏了」工作「。 –

回答

3

此錯誤消息的明顯原因是Items未執行IFields

換句話說,你Items類型需要有這樣的:

public class Items : IFields 
        ^-----^ 

如果沒有這個,那麼Items不是有效的類型,請GetByID<T>方法,因爲它沒有實現這個接口。

即使Items類型碰巧擁有正確的成員,情況也是如此。除非你明確指出那些成員也實現了接口,通過做我上面所展示的,那是不夠的。因此,即使您的Items類型具有id屬性,您仍然必須明確聲明該類型實現了該接口。

相關問題