Ho preso in prestito il codice qui sotto da another question (leggermente modificato), da utilizzare nel mio codice:Perché/quando è importante specificare un operatore come esplicito?
internal class PositiveDouble
{
private double _value;
public PositiveDouble(double val)
{
if (val < 0)
throw new ArgumentOutOfRangeException("Value needs to be positive");
_value = val;
}
// This conversion is safe, we can make it implicit
public static implicit operator double(PositiveDouble d)
{
return d._value;
}
// This conversion is not always safe, so we're supposed to make it explicit
public static explicit operator PositiveDouble(double d)
{
return new PositiveDouble(d); // this constructor might throw exception
}
}
L'autore originale di questo codice aderisce correttamente alle avvertenze contenute nella documentazione implicit & explicit di MSDN, ma qui c'è la mia domanda: È sempre necessario explicit
in un codice potenzialmente eccezionale?
Così, ho alcuni tipi nel mio codice (ad esempio, "Volume"), che derivano dalla PositiveDouble e mi piacerebbe essere in grado di impostare le istanze comodamente come la prima riga sotto:
Volume v = 10; //only allowed by implicit conversion
Volume v = new Volume(10) //required by explicit conversion, but gets messy quick
Essere obbligati a usare cast espliciti ovunque rende il codice molto meno leggibile. Come protegge l'utente? Nella semantica del mio programma, non mi aspetto mai un volume negativo; anzi, se mai dovesse succedere, mi aspetto che venga lanciata un'eccezione. Quindi, se utilizzo una conversione implicita e si getta, quali "risultati inaspettati" potrebbero clobber me?
Sembra che cambiare l'operatore di conversione in implicito dovrebbe andare bene qui. – Botonomous
Si consiglia, in particolare, in un'API pubblica. Impedisce alle persone di usare il cast senza accorgersene, risparmiando tempo nel debugging. Fare in modo che le persone notino il cast eviterà problemi. Dicono "oh, quindi pensi di essere intelligente rendendo tutto il cast implicito?" e tu dici "Se sai quello che stai facendo, non avrai problemi" - immagina una stufa che parte quando c'è qualcosa, perché "Essere costretti ad accendere la stufa ogni volta rende la cottura molto meno efficiente", e i produttori rispondono alle affermazioni con "allora non mettere le cose sopra" - solo meno drammatiche e senza le ustioni. – Theraot