Existe outro operador “é” em C #? [duplicado]
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
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
- Pelo menos, de acordo com um dos desenvolvedores da equipe C # da Microsoft . Mas o que ele sabe? Ele apenas construiu a coisa.
- Realmente, C # 6 se você contar filtros de exceção .
- Jared Parsons novamente .
- 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.