2016-03-30 3 views
0

Я пытаюсь сделать список, чтобы добавить его, добавив в него элемент.C# Перегрузка generic + operator

Целевое использование кода я пытаюсь сделать случиться:

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

То, что я пытался. «operator +» должен перегружать + и «этот 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) 's подобный вопрос, который может помочь вам. –

ответ

4

Операторы могут быть перегружены только в определении класса. Вы не можете переопределять их извне с помощью методов расширения.

Кроме того, хотя бы один из параметров должен быть того же типа, что и класс.

Так что лучшее, что вы можете сделать что-то вроде:

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

что вы можете использовать как:

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

list += 3; 

Console.WriteLine(string.Join(", ", list)); // Will print 1, 2, 3 
-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

Смежные вопросы