2016-11-23 9 views
0

にT」「typeパラメータとして使用することはできません」IFiedsインタフェースはタイプは、「ジェネリック型またはメソッド

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

私がしようとしているところ私はこの一般的な方法

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

を作成しました値を取得するには、これは明らかに以下のコンパイルエラーで

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

をコンパイルしません。

型「項目は、」ジェネリック タイプ又は方法 「DB.GetByID(System.Collections.Generic.IEnumerable、INT)」タイプのパラメータ「T」として使用することができません。そこに は「アイテム」から「IFields」への暗黙的な参照変換ではありません

どのように修正できますか? 実際、私はラムダ式を "匿名型で"使用したいと考えています。

+3

'Items'は' IFields'を実装していますか? –

+0

@ LasseV.Karlsen実際にいいえ – OrElse

+2

あなたは何が起こると思いますか?あなたは特に 'T'がそのインターフェースを実装しなければならないと言っていますし、そうでないタイプを渡そうとしています。なぜ私はあなたにそのエラーメッセージが表示されるかを簡単な答えを投稿することができますが、これは本当にあなたを助けるつもりはないと思います。なぜ制約を加えたのか、それを実装していない型を渡すときに起こると思われる理由や理由を教えてください。おそらく、「ここで勝利した理由は何ですか? t仕事 "。 –

答えて

3

このエラーメッセージの明白な理由は、ItemsIFieldsを実装していないことです。

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

あなたはこれを持っていない場合は、このインタフェースを実装していないので、その後、ItemsがあなたのGetByID<T>方法の有効なタイプではありません。つまり

、あなたのItemsタイプはこれを持っている必要があります。

Itemsタイプにちょうど正しいメンバーがあっても、これは当てはまります。これらのメンバーがインターフェイスを実装していることを明示していない限り、上で示したことを実行することで、それだけでは不十分です。だからItemsタイプにidプロパティがある場合でも、そのタイプがそのインターフェースを実装していることを明示的に述べる必要があります。

関連する問題