System.Nullable Qual è il valore del valore di int null *?
-
19-09-2019 - |
Domanda
Si considerino le seguenti dichiarazioni:
int? v1 = null;
int? v2 = 5 * v1;
Qual è il valore di v2
? (null
o stringa vuota?)
Come posso impedire al compilatore di segnare il funzionamento come non valido? Ho bisogno di seguire la gestione delle eccezioni personalizzato?
Soluzione
E 'null
.
C # Language Specification 3.0 (Sezione §7.2.7: operatori Lifted)
Per gli operatori binari
+
-
*
/
%
&
|
^
<<
>>
:una forma alzato di un operatore esiste se i tipi di operando e di risultato sono tutti tipi di valore non annullabili. Il modulo viene sollevato costruito aggiungendo un singolo modificatore
?
ad ogni tipo di operando e il risultato. L'operatore sollevato produce un valorenull
se uno o entrambi gli operandi sononull
(a eccezione degli operatori&
e|
del tipobool?
, come descritto in §7.10.3). In caso contrario, l'operatore sollevato scarta gli operandi, applica l'operatore sottostante, e avvolge il risultato.
Come posso impedire al compilatore di segnare il funzionamento come non valido? Ho bisogno di seguire la gestione delle eccezioni personalizzato?
Non è un'operazione non valida. Non sarà un'eccezione in modo che non è necessario per gestire le eccezioni in questo caso.
Altri suggerimenti
Se si desidera che l'operazione deve essere evitato con il compilatore, rendono la seconda variabile non annullabile. Poi si sarà costretti a scrivere:
int v2 = 5 * v1.Value;
Questo sarà un'eccezione in fase di esecuzione, se v1 è nullo.
Il suo valore sarà "nullo", in questo contesto, almeno può essere considerato lo stesso come variabile nulla, cioè piuttosto che niente, o zero, significa "Sconosciuto". Cinque sacco di Unknown è ancora sconosciuta, sarà anche non essere mai "stringa vuota", come hai a che fare con i numeri, non stringhe.
Non sono sicuro di cosa si intende per "Come posso evitare che il compilatore per contrassegnare il funzionamento come non valido?" come questo codice compila e funziona bene per me in Visual Studio 2008 =)
Non sono sicuro di ciò che si sta cercando di fare, ma se si vuole v2 per essere nullo se v1 è nullo allora si dovrebbe verificare se v1 ha un valore prima di utilizzarlo.
int? v2 = v1.HasValue ? 5 * v1.Value : null;
o
int? v2 = null;
if (v1.HasValue) { v2 = 5 * v1.Value; }