2012-02-04 22 views
6

Próbuję przeciążać operatora w C# (nie pytaj dlaczego!), Który dotyczy Lists. Na przykład, chciałbym, aby móc napisać:Przeciążanie operatora C# z listą <T>

List<string> x = // some list of things 
List<string> y = // some list of things 
List<string> z = x + y 

tak, że „z” zawiera całą zawartość „x”, po której treść „y”. Jestem świadomy, że istnieją już sposoby łączenia dwóch list, próbuję tylko zrozumieć, w jaki sposób przeciążanie operatorów działa z ogólnymi strukturami.

(Jest to klasa List z Systems.Collections.Generic, nawiasem mówiąc).

+0

'Lista' w twojej próbce to Twoja własna implementacja? Lub z przestrzeni nazw 'System.Collections.Generic? –

+0

Jest to z System.Collections.Generic. – Joe

Odpowiedz

7

O ile mi wiadomo, nie jest to wykonalne: należy wdrożyć przeciążenie operatora w rodzaju, który go używa. Ponieważ List<T> nie jest Twoim typem, nie możesz przesłonić w nim operatorów. Można uzyskać własny typ z List<string> i zastąpić operatora wewnątrz klasy.

class StringList : List<string> { 
    public static StringList operator +(StringList lhs, StringList rhs) { 
    } 
} 
+2

Nie zapominaj, że operatorzy są wybierani na podstawie typów kompilacji. Więc 'List a = new StringList(), b = new StringList(); var c = a + b' nie działa. – svick

+1

@svick Masz całkowitą rację, nie można oszukać kompilatora, który w jakiś sposób akceptuje operatora na operandach, które nie są * statycznie * wpisane jako klasa, w której zdefiniowałeś operatora. – dasblinkenlight

+0

Dlaczego więc mogę przeciążyć '*' do pracy z 'String's, ale nie' List 's? – Joe

Powiązane problemy