Existe outro operador “é” em C #? [duplicado]

Sep 17 2020

Eu estava ensinando meus alunos a escrever uma função. Usei um algoritmo simples para determinar se um valor de char é uma letra real (e não um dígito ou outra coisa).

Então, eu realmente digitei o que meu aluno disse (bancando o idiota propositalmente): "if (a letra é 'A') {...}" Para minha surpresa, isso não causou um erro do compilador. Eu adicionei a mesma verificação para 'B' e 'C' e meu programa agora pode determinar que A, B e C são de fato letras.

Por que isso funciona? E O QUE exatamente estou comparando aqui? Não estou usando comparações de tipo ativamente, que é o que a Internet está sempre aparecendo.

Fiz uma experiência adicional com outros valores:

 char l = 'A';
 if (l is 'A')
 {
    Console.WriteLine("l 'A'...");
 }
 if (l is "A")
 {
    // Doesn't compile.
 }

 int x = 15;
 if (x is 15)
 {
    Console.WriteLine("X is 15.");
 }
 if (x is 5.6)
 {
    // Also doesn't compile.
 }

Pelo que posso dizer, "is" funciona como uma versão estendida do operador de igualdade (==) que também impõe o mesmo tipo. Mas não consigo encontrar nenhuma documentação sobre ele.

Respostas

6 JoelCoehoorn Sep 16 2020 at 23:50

is pode ter dois significados, dependendo de qual versão do C # você possui.

Em versões mais antigas do C #, isera a abreviação de "é atribuível a" ou "é atribuível de", dependendo de como você lê o código em sua cabeça. Não funcionaria para o código em sua classe porque ele espera um tipo no lado direito, mas eu o incluo aqui para ser completo. Também é útil como uma verificação nula eficiente e portátil, ou seja, variable is objecté a melhor maneira de escrever variable != null1 .

Em versões mais recentes do C #, istambém pode ser usado para correspondência de padrões . Isso foi introduzido em C # 7 2 e estendido em C # 8 , com mais novidades em 9. Especificamente, o código na questão cria uma expressão de Padrão Constante .

Aqui está outra maneira divertida de ver este trabalho. Vindo em C # 9, em vez de escrever uma verificação como esta:

if (!string.IsNullOrEmpty(mystring))

Você poderia escrever 3

if (mystring is {Length:>0})

O que é bom porque é mais curto e você poderia fazer um argumento removendo a negação torna mais fácil de entender. 4


  1. Pelo menos, de acordo com um dos desenvolvedores da equipe C # da Microsoft . Mas o que ele sabe? Ele apenas construiu a coisa.
  2. Realmente, C # 6 se você contar filtros de exceção .
  3. Jared Parsons novamente .
  4. Eu rejeitaria esse argumento porque quaisquer ganhos na remoção da negação são menores do que a sutileza introduzida em como validamos para nulo. Mas você pode tentar o argumento;) E antes que alguém pergunte, não tenho ideia no momento como as duas opções funcionam.