Wie kann ich eine andere Struktur auf meine Art implizit konvertieren?
-
26-09-2019 - |
Frage
Wie es MyClass x = 120;
ist, ist es möglich, eine solche individuelle Klasse erstellen?
Wenn ja, wie kann ich das tun?
Lösung
Es ist generell eine schlechte Idee zu verwenden implizite Operatoren betrachtet, wie sie sind, nach allem, implizit und hinter dem Rücken laufen. Debug-Code übersät mit Bedienungs Überlastungen ist ein Alptraum. Das sei gesagt, mit so etwas wie folgt aus:
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;
}
}
Sie können verwendet werden:
Complex complex = 10;
oder man könnte jemals den Operator + Überlastung
public static Complex operator +(Complex cmp, int value)
{
Complex x = new Complex();
x.Real = cmp.Real + value;
x.Imaginary = cmp.Imaginary;
return x;
}
und verwenden Sie Code wie
complex +=5;
Andere Tipps
Nicht sicher, ob dies ist, was Sie wollen, aber Sie können es erhalten, indem die impliziten Betreiber der Umsetzung: http://msdn.microsoft.com/en-us /library/z5z9kes2(VS.71).aspx
Einen impliziten Operator:
http://msdn.microsoft.com/en-us/library /z5z9kes2.aspx
Zum Beispiel:
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);
}
}
„Ist das eine gute Idee?“ ist fraglich. Implizite Konvertierungen ist in der Regel akzeptierte Standards für Programmierer zu brechen; im Allgemeinen keine gute Idee. Aber wenn Sie einige großen Wert Bibliothek tun, zum Beispiel, dann könnte es eine gute Idee sein.
ja, hier ist ein kurzes Beispiel ...
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); }
}