2012-03-06 2 views
4

私は、次の拡張メソッドがあります。拡張メソッド(ないアセンブリ参照の問題)

ItemMovementはIItemMovementを実装
List<IItemMovement> p = new List<IItemMovement>(); 
    EntitySet<ItemMovement> ims = p.ToEntitySetFromInterface<ItemMovement, IItemMovement>(); 

を次のようにそれを使用しようとする

public static EntitySet<T> ToEntitySetFromInterface<T, U>(this IList<U> source) 
    where T : class, U 
{ 
    var es = new EntitySet<T>(); 
    IEnumerator<U> ie = source.GetEnumerator(); 
    while (ie.MoveNext()) 
    { 
     es.Add((T)ie.Current); 
    } 
    return es; 
} 

とイムを。コンパイラは文句:

「をSystem.Collections.Generic.List」タイプ の最初の引数を受け入れる「ToEntitySetFromInterface」と拡張子なしの方法 「ToEntitySetFromInterface」の の定義が含まれていません「System.Collections.Generic .List 'が見つかりました( にはusingディレクティブまたはアセンブリ参照がありません)

いいえ私は参照がありません。メソッドを含む静的クラスの名前を入力するだけで、そのメソッドがポップアップするだけで、拡張メソッドもポップアップします。 Thnx

+0

わからないリスト list = new List ();コンパイルするだろうか? – AaronHS

+1

それ以外のコードは私のために働いています(ItemMovementとIItemMovementを嘲笑して) – AaronHS

+2

この質問はインテリセンスとは関係がないと思いますが、コンパイルできないとインテリセンスの欠陥はほとんどありません – demoncodemonkey

答えて

2

このコードは、私の作品であり、コードの直接コピーからItemMovementとそのインターフェイスを除いているので、おそらく何か問題がありますか?

public class TestClient 
{ 
    public static void Main(string[] args) 
    { 
     var p = new List<IItem>(); 
     p.Add(new Item { Name = "Aaron" }); 
     p.Add(new Item { Name = "Jeremy" }); 

     var ims = p.ToEntitySetFromInterface<Item, IItem>(); 

     foreach (var itm in ims) 
     { 
      Console.WriteLine(itm); 
     } 

     Console.ReadKey(true); 
    } 
} 

public class Item : IItem 
{ 
    public string Name { get; set; } 
    public override string ToString() 
    { 
     return Name; 
    } 
} 

public interface IItem 
{ 
} 

public static class ExtMethod 
{ 
    public static EntitySet<T> ToEntitySetFromInterface<T, U>(this IList<U> source) where T : class, U 
    { 
     var es = new EntitySet<T>(); 
     IEnumerator<U> ie = source.GetEnumerator(); 
     while (ie.MoveNext()) 
     { 
      es.Add((T)ie.Current); 
     } 
     return es; 
    } 
} 
+0

私はあなたのコードをコピーし、それは働いた。しかし、私はそれを上記のコードと同じクラスファイルにコピーしたとき、私は私がそれを割り引いたとは思っていませんでした。名前空間の問題は、私が拡張メソッドクラスLinqExtensionsを呼び出すことができるかどうかをテストすることで、実際に可能であったため、完全に修飾された名前空間を使わずにそのクラスをどのように呼び出すことができます。今すぐに完了しました。Thnx。 – rism

1

コンパイラエラーのこの部分はキーではありません:「タイプの最初の引数を受け入れ何の拡張メソッド 『ToEntitySetFromInterface』 『System.Collections.Generic.List』」。

ToEntitySetFromInterface<T,U>拡張メソッドはIList<U>を受け入れるように定義されていますが、IList<T>ではなくList<T>で呼び出すようにしています。タイプが一致しないため、コンプレッサーはあなたの拡張メソッドを見つけられません。

+0

こんにちは、私は何を意味するのか分かりませんリスト?私はToEntitySeを呼び出していますtFromInterface (このIList ソース)ので、IList型は、IItemMovementであるUの型、つまりILIst によって定義されます。 (このIList ソース)は、この場合にIList およびp = IList である拡張メソッドを適用することができるタイプを決定するので、私はあなたの言っていることにかなり従いません。私が持っている上記の注意:List しかし、IList に変更しても、私はまだ同じ問題/エラーが発生します。 – rism

+0

@rism、私は間違っています。謝罪いたします。 –