Je n'ai jamais fait beaucoup de travail avec les opérateurs de surcharge, en particulier les conversions implicites et explicites.Opérateur explicite et implicite avec des types numériques et des résultats inattendus
Cependant, j'ai plusieurs paramètres numériques qui sont fréquemment utilisés, donc je crée une structure comme un wrapper autour d'un type numérique pour taper fortement ces paramètres. Voici un exemple d'implémentation:
public struct Parameter
{
private Byte _value;
public Byte Value { get { return _value; } }
public Parameter(Byte value)
{
_value = value;
}
// other methods (GetHashCode, Equals, ToString, etc)
public static implicit operator Byte(Parameter value)
{
return value._value;
}
public static implicit operator Parameter(Byte value)
{
return new Parameter(value);
}
public static explicit operator Int16(Parameter value)
{
return value._value;
}
public static explicit operator Parameter(Int16 value)
{
return new Parameter((Byte)value);
}
}
Comme j'expérimentais avec ma mise en œuvre de test pour obtenir un blocage des opérateurs explicites et implicites, j'ai essayé de jeter explicitement Int64
à mon type Parameter
et à ma grande surprise, il n'a pas jeté une exception, et encore plus surprenant, il a juste tronqué le nombre et a évolué. J'ai essayé d'exclure l'opérateur explicite personnalisé et il se comportait toujours de la même manière.
public void TestCast()
{
try
{
var i = 12000000146;
var p = (Parameter)i;
var d = (Double)p;
Console.WriteLine(i); //Writes 12000000146
Console.WriteLine(p); //Writes 146
Console.WriteLine(d); //Writes 146
}
catch (Exception ex)
{
Console.WriteLine(ex.Message); //Code not reached
}
}
Je répète mon expérience avec une Byte
plaine en place de mon struct et a le même comportement exact, donc de toute évidence ce comportement est normal, mais je pensais un casting explicite qui se traduit une perte de données jetterait une exception.
Non, moulages explicites peuvent perdre des informations. Les conversions implicites ne devraient pas. –
Compilez-vous avec 'AnyCPU',' x32' ou 'x64'? – ja72
@ ja72 Désolé pour le délai de réponse, mais je compile avec x86 – psubsee2003