Qual è il valore predefinito del tipo nullable "int?" (compreso il punto interrogativo)?


100

In C #, qual è il valore predefinito di una variabile di istanza di classe di tipo int??

Ad esempio, nel codice seguente, quale valore avrà MyNullableIntse non viene mai assegnato esplicitamente?

class MyClass
{
    public int? MyNullableInt;
}

(Sembra probabile che la risposta sia quasi certamente o nullo 0, ma quale di queste è?)


9
Perché il voto negativo? (La risposta a questa domanda non era inizialmente ovvia per me senza effettivamente eseguire il codice per testare il comportamento; e sorprendentemente, non sono riuscito a trovare un duplicato di questa domanda su StackOverflow, o facilmente reperibile altrove tramite Google.)
Jon Schneider

1
Avresti potuto guardare qui - il primo colpo di Google per me.
500 - Errore interno del server

2
@ 500 - Ho trovato quell'articolo durante la ricerca - in realtà l'ho collegato nella mia risposta di seguito - ma per quanto ne so, l'articolo non afferma esplicitamente che il valore predefinito di un'istanza di tipo nullable è zero. E non dire "Il valore predefinito per HasValue è falso. Beni il cui valore non ha alcun valore di default", ma che non risponde direttamente alla mia domanda originale senza qualche scavo supplementare.
Jon Schneider

2
Mi chiedo se fosse perché potresti semplicemente impostare un punto di interruzione e vedere qual è il valore, o nel tipo Finestra immediata int? x;e vedere qual è il risultato?
Rufus L

Risposte:


135

Il valore predefinito per int?- e per qualsiasi tipo nullable che utilizza il "tipo?" dichiarazione - è null.

Perché questo è il caso:

  • int?è lo zucchero sintattico per il tipo Nullable <T> (dove T è int), una struttura. ( riferimento )
  • Il Nullable<T>tipo ha un membro bool HasValue , che quando false, fa sì che l' Nullable<T>istanza "agisca come" un nullvalore. In particolare, il metodo Nullable <T> .Equals viene sottoposto a override per restituire truequando un Nullable<T>with HasValue == falseviene confrontato con un nullvalore effettivo .
  • Dalla specifica del linguaggio C # 11.3.4 , il valore predefinito iniziale di un'istanza di struct è tutti i campi del tipo di valore di quella struct impostati sul valore predefinito e tutti i campi del tipo di riferimento di quella struct impostati su null.
  • Il valore predefinito di una boolvariabile in C # è false ( riferimento ). Pertanto, la HasValueproprietà di Nullable<T>un'istanza predefinita è false; che a sua volta fa sì che Nullable<T>quell'istanza stessa si comporti come null.

Quando cambio una dichiarazione da int? x = null;a int? x;, ottengo errori del compilatore più in basso nel codice: "Uso della variabile locale x non assegnata".
John Pick

1
@JohnPick Questa è una funzionalità del compilatore C # intesa a prevenire bug che potrebbero derivare da te "dimenticando" di inizializzare una variabile prima di usarla. Una situazione in cui puoi incontrare un int non inizializzato? è quando è una variabile membro di una classe. Esempi di entrambi qui: blogs.msdn.microsoft.com/abhinaba/2005/11/08/…
Jon Schneider

Quindi fondamentalmente questo posto è il tuo blog tecnologico? Poni domande per le quali devi solo eseguire il codice per ottenere la risposta, quindi rispondi tu stesso alla domanda nello stesso minuto.
GôTô

4
@ JonSchneider abbastanza giusto, il mio male allora
GôTô

Compilatore suggerimento / avvisi di VS è fuorviante: Field 'id' is never assigned to, and will always have its default value 0. Strano non è vero?
Hendy Irawan

30

Mi è sembrato importante condividere il Nullable<T>.GetValueOrDefault()metodo che è particolarmente utile quando si lavora con calcoli matematici che utilizzano valori Nullable<int>aka int?. Ci sono molte volte in cui non devi controllare la HasValueproprietà e puoi semplicemente usare GetValueOrDefault().

var defaultValueOfNullableInt = default(int?);
Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString());

var defaultValueOfInt = default(int);
Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt);

Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault());

Riga di comando che mostra il codice sopra funzionante


0
var x = default (int?);
Console.WriteLine("x == {0}", (x == null) ? "null" : x.ToString());
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.