2010-06-10 7 views

Répondre

4

Il est généralement considéré comme une mauvaise idée d'utiliser des opérateurs implicites, car ils sont, après tout, implicite et courir derrière votre dos. Le code de débogage jonché de surcharges de l'opérateur est un cauchemar. Cela dit, quelque chose comme ceci:

public class Complex 
{ 
    public int Real { get; set; } 
    public int Imaginary { get; set; } 

    public static implicit operator Complex(int value) 
    { 
     Complex x = new Complex(); 
     x.Real = value; 
     return x; 
    } 
} 

vous pouvez utiliser:

Complex complex = 10; 

ou vous pourriez jamais surcharger l'opérateur +

public static Complex operator +(Complex cmp, int value) 
{ 
    Complex x = new Complex(); 
    x.Real = cmp.Real + value; 
    x.Imaginary = cmp.Imaginary; 
    return x; 
} 

et utiliser le code

complex +=5; 
+0

Honnêtement, j'ai lu l'opérateur impitoyable sur MSDN mais je ne pouvais pas l'implémenter à cause d'une erreur. Maintenant, je l'ai testé votre code et cela fonctionne.Merci – Freshblood

+0

Je suis heureux d'avoir aidé. – SWeko

3

Créer un opérateur implicite:

http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx

Par exemple:

public struct MyStruct // I assume this is what you meant, since you mention struct in your title, but use MyClass in your example. 
{ 
    public MyClass(int i) { val = i; } 
    public int val; 
    // ...other members 

    // User-defined conversion from MyStruct to double 
    public static implicit operator int(MyStruct i) 
    { 
     return i.val; 
    } 
    // User-defined conversion from double to Digit 
    public static implicit operator MyStruct(int i) 
    { 
     return new MyStruct(i); 
    } 
} 

"Est-ce une bonne idée?" est discutable. Les conversions implicites tendent à briser les normes acceptées pour les programmeurs; généralement pas une bonne idée. Mais si vous faites une bibliothèque de grande valeur, par exemple, ce pourrait être une bonne idée.

1

oui, voici un court exemple ...

public struct MyCustomInteger 
    { 
    private int val; 
    private bool isDef; 
    public bool HasValue { get { return isDef; } } 
    public int Value { return val; } } 
    private MyCustomInteger() { } 
    private MyCustomInteger(int intVal) 
    { val = intVal; isDef = true; } 
    public static MyCustomInteger Make(int intVal) 
    { return new MyCustomInteger(intVal); } 
    public static NullInt = new MyCustomInteger(); 

    public static explicit operator int (MyCustomInteger val) 
    { 
     if (!HasValue) throw new ArgumentNullEception(); 
     return Value; 
    } 
    public static implicit operator MyCustomInteger (int val) 
    { return new MyCustomInteger(val); } 
    } 
+0

Ne voulez-vous pas dire implicite plutôt qu'explicite? – ChrisF

+0

Lequel? Les deux sont là ... 'implicite' est pour quand il n'y a aucune chance que la distribution puisse échouer ... 'explicite' est pour quand elle peut échouer ... –

+0

Ah, mon erreur. Je m'attendais à ce que les deux soient «implicites», ce qui serait le cas si vous pouviez lancer les deux façons sans vérifier. – ChrisF

Questions connexes