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?

È stato utile?

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 valore null se uno o entrambi gli operandi sono null (a eccezione degli operatori & e | del tipo bool?, 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; }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top