Comme c'est MyClass x = 120;
, est-il possible de créer une telle classe personnalisée? Si oui, comment puis-je faire cela?Comment puis-je convertir implicitement une autre structure à mon type?
Répondre
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;
Je ne sais pas si cela est ce que vous voulez, mais vous pouvez y arriver en mettant en œuvre l'opérateur implicite: http://msdn.microsoft.com/en-us/library/z5z9kes2(VS.71).aspx
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.
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); }
}
Ne voulez-vous pas dire implicite plutôt qu'explicite? – ChrisF
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 ... –
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
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
Je suis heureux d'avoir aidé. – SWeko