Pergunta

Considere as seguintes afirmações:

int? v1 = null;

int? v2 = 5 * v1;

Qual é o valor v2? (null ou string vazia?)

Como posso evitar que o compilador marque-o como operação inválida?Preciso seguir o tratamento de exceções personalizado?

Foi útil?

Solução

Isso é null.

C# Especificação de idioma 3.0 (Seção §7.2.7: Operadores levantados)

Para os operadores binários + - * / % & | ^ << >> :

Existe uma forma levantada de um operador se o operando e os tipos de resultados forem todos os tipos de valor não indicáveis. A forma levantada é construída adicionando um único ? modificador para cada operando e tipo de resultado. O operador levantado produz um null valor se um ou ambos os operando forem null (uma exceção sendo o & e | operadores do bool? Tipo, conforme descrito em §7.10.3). Caso contrário, o operador levantado desembrulha os operando, aplica o operador subjacente e envolve o resultado.


Como posso impedir o compilador para marcá -lo como operação inválida? Eu preciso seguir o manuseio de exceção personalizado?

Não é uma operação inválida. Não será uma exceção para que você não precise lidar com exceções neste caso.

Outras dicas

Se você deseja que a operação seja evitada pelo compilador, torne a segunda variável não indicável. Então você será forçado a escrever:

int v2 = 5 * v1.Value;

Isso lançará uma exceção no tempo de execução se V1 for nulo.

Seu valor será "nulo", neste contexto pelo menos pode ser considerado igual a um banco de dados nulo, ou seja,em vez de Nada ou Zero, significa "Desconhecido".Cinco lotes de desconhecidos ainda são desconhecidos; também nunca será uma "string vazia", ​​pois você está lidando com números, não com strings.

Não tenho certeza do que você quer dizer com "Como posso impedir o compilador para marcar como operação inválida?" Como esse código compila e funciona bem para mim no Visual Studio 2008 =)

Não tenho certeza do que você está tentando fazer, mas se quiser que v2 seja nulo se v1 for nulo, você deve testar se v1 tem um valor antes de usá-lo.

int? v2 = v1.HasValue ? 5 * v1.Value : null;

ou

int? v2 = null;
if (v1.HasValue) { v2 = 5 * v1.Value; }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top