2010-10-20 6 views

Répondre

3

No; l'un des paramètres doit être le type conteneur.

De section §10.10.2 de la spécification du langage (version 4.0):

Les règles suivantes appliquent aux déclarations d'opérateurs binaires, où T désigne le type d'instance de la classe ou struct qui contient la déclaration de l'opérateur :

• Un opérateur binaire sans décalage doit prendre deux paramètres, dont au moins un doit avoir le type T ou T?, et peut renvoyer n'importe quel type.

Vous devriez penser à pourquoi. Voici une raison.

class A { } 
class B { public static A operator+(A first, A second) { // ... } } 
class C { public static A operator+(A first, A second) { // ... } } 

A first; 
A second; 
A result = first + second; // which + ??? 

Voici une autre:

class A { public static int operator+(int first, int second) { // ... } } 

On suppose ce qui a permis un instant.

int first = 17; 
int second = 42; 
int result = first + second; 

par la spécification pour la résolution de la surcharge de l'opérateur (§ 7.3.2), A.+ aura préséance sur Int32.+. Nous venons de redéfinir l'addition pour int s! Méchant.

+0

Il existe des méthodes d'extension. Je pensais qu'il y a quelque chose de similaire pour les opérateurs. –

+1

@Lavir: Nous avons envisagé d'ajouter des opérateurs d'extension à C# 4 mais nous n'avions pas le budget pour le faire. Peut-être dans une version future hypothétique de la langue. –

1

Non, vous ne pouvez pas. "Dans chaque cas, un paramètre doit être du même type que la classe ou la structure qui déclare l'opérateur" quote from Documentation on overloading operators.

0

En général dire non, mais vous pouvez faire quelque chose comme suit, si elle aide :)

class A 
{ 
    public static A operator +(A x, A y) 
    { 
     A a = new A(); 
     Console.WriteLine("A+"); // say A 
     return a; 
    } 
} 

class B 
{ 
    public static A operator +(A x, B y) 
    { 
     A a = new A(); 
     Console.WriteLine("return in:A,B in out:A in class B+"); // say B 
     return a; 
    } 

    public static A operator +(B x, B y) 
    { 
     A a = new A(); 
     Console.WriteLine("return in:B,B in out:A in class B +"); 
     return a; 
    } 
    // and so on.... 

} 


B b = new B(); 
A a = new A(); 
A a1 = new A(); 
B b1 = new B(); 

a = b + b1; // here you call operator of B, but return A 
a = a + a1; // here you call operator of A and return A 

Pour comprendre votre problème, puis-je vous demander pourquoi vous voulez faire cela? :)

+0

Je veux étendre IEnumerable avec les opérateurs "+", "==" et "! =". –

+0

Ensuite, je pense que votre classe que vous allez énumérer devrait être dérivée de System.Collections.IEnumerable. Et puis dans votre classe (qui dérive de IEnumerable) vous devez surcharger les opérateurs dont vous avez besoin et cela devrait faire l'affaire. – dmitril

+0

J'ai besoin de comparer et de concaténer n'importe quel IEnumerables en fait, qu'il s'agisse de Lists ou de Sets ou de toute autre structure de données. –

Questions connexes