Qualcun altro qui può probabilmente spiegare perché gli sviluppatori .NET hanno deciso di non utilizzare una sorta di predizione per determinare come un numero letterale dovrebbe essere calzato nel tipo che si sta fornendo ad esso. Ma in assenza di qualsiasi tipo di filosofia, la risposta è semplice: non volevano farlo, quindi non lo fecero. Non ho intenzione di dirti che a titolo definitivo non dovresti preoccupartene, perché ovviamente non è assolutamente irragionevole voler un compilatore per capire esattamente quello che vuoi. Almeno sarebbe carino, vero?
(Se io avessi indovinare, però, direi che ha molto a che fare con che permette una sorta di logica tipizzazione implicita - float f = 1.0
è float
, ma var d = 1.0
è double
Questo diventa ancora meno logico quando si? considerare che f.Equals (d) sarebbe false
, nonostante il fatto che è 1.0 == 1.0
true
.)
Ma, ammesso che avevano buoni motivi per non introdurre alcuna previsione specifico tipo definizione (e alcuni più perfettamente buoni motivi può essere trovato nel post di Rotem), il miglior motivo per cui posso immaginare hanno deciso che double num1 = 1.23
è accettabile, e float num1 = 1.23
no, è che double
è francamente più utile nella maggior parte dei casi. Le penalità di CPU e IO dell'utilizzo di un valore a virgola mobile a 64 bit rispetto a 32 bit sono trascurabili nella maggior parte dei casi d'uso, ma l'utilità di non doversi preoccupare di superare i limiti di quel tipo di dati è significativa.
Si noti che è possibile fare esattamente lo stesso argomento sul motivo per cui 1.23
non può essere assegnato a un decimal
senza un suffisso. Le persone che hanno progettato C# hanno deciso che era più facile fare supposizioni sul tipo di un numero letterale di qualsiasi formato, e double
è un'ipotesi del tutto ragionevole dato che la maggior parte delle persone che scrivono 1.23
desidera un double
o almeno dovrebbe usare uno.
modifica: titolo utente fisso.
L'assegnazione num2 non verrà compilata: 1.23 viene considerato come un doppio valore letterale e non può essere assegnato a una variabile float. – furkle
furkle: modificato. – 911
Niente lo impedisce tranne che gli autori del compilatore non l'hanno implementato. –