2016-03-30 12 views
0

私はリストに項目をプラスすることで追加できるようにしようとしています。C#Overload generic + operator

コードの

ターゲット使用私は実現するためにしようとしている:

List<int> numbers = new List<int>(); 
numbers += 10; 

私が試したどのような。 "operator +"はオーバーロードし、 "this IList"は汎用IListを拡張する必要があります。

public static IList<T> operator +<T>(this IList<T> list, T element) 
{ 
    list.Add(element); 
    return list; 
} 

それは視覚的なスタジオで、どこでもそれ以上、しかし赤い下線が働いていない2012年 は私が間違って何をしているのですか?これは不可能ですか?なぜ標準クラスでは動作しますが、ジェネリッククラスでは動作しませんか?

+0

[ここ](http://stackoverflow.com/questions/14020486/operator-overloading-with-generics?rq=1)はあなたに役立つかもしれない同様の質問です。 –

答えて

4

演算子は、クラスの定義でのみオーバーロードできます。拡張メソッドを使用して外部からオーバーライドすることはできません。

また、少なくとも1つのパラメータはクラスと同じ型でなければなりません。

だから、あなたができる最善のようなものである:上記の受け入れ答えは尋ねた質問のためのより良い動作しますが、他に

var list = new CustomList<int> { 1, 2 }; 

list += 3; 

Console.WriteLine(string.Join(", ", list)); // Will print 1, 2, 3 
-2

:あなたは、その後のように使用することができます

public class CustomList<T> : List<T> 
{ 
    public static CustomList<T> operator +(CustomList<T> list, T element) 
    { 
     list.Add(element); 
     return list; 
    } 
} 

誰かが2つのタイプのリストを追加して元のリストを保持する必要がある場合。私はおそらく別のトピックでこれを投稿しているはずですが、 "C#でオーバーロード+演算子"を検索すると、これがトップの結果になります。うまくいけば誰かを助けるかもしれない。

void Main() 
{ 
    List<string> str = new List<string> {"one", "two", "three"}; 
    List<string> obj = new List<string> {"four", "five", "six", "seven"}; 
    foreach (string s in str + obj) Console.Write(s + ", "); 
} 

public class List<T> : System.Collections.Generic.List<T> 
{ 

    public static List<T> operator +(List<T> L1, List<T> L2) 
    { 
     List<T> tmp = new List<T>() ; 
     foreach (T s in L1) tmp.Add(s); 
     foreach (T s in L2) tmp.Add(s); 
     return tmp ; 
    } 
} 

//one, two, three, four, five, six, seven, 
+0

あなたが使いたいのは、.Netライブラリのデフォルトの汎用リストであれば、コードが役に立ちます。 tmpリストを使用すると元のリストをそのまま維持できます – madgosht

+0

答えにいくつかのコンテキストを追加してもよろしいですか?コードを投稿するだけで便利ですが、詳細な説明は他の人にも役立ちます。 – Aaron

+1

OPが提供する例では動作しません。受け入れられた答えは期待どおりに機能します。 – zanussi