Compartilhar via


Flexibilização dos requisitos do operador de turnos

Observação

Este artigo é uma especificação de recurso. A especificação serve como o documento de design para o recurso. Ele inclui mudanças de especificação propostas, juntamente com as informações necessárias durante o design e desenvolvimento do recurso. Estes artigos são publicados até que as alterações de especificações propostas sejam finalizadas e incorporadas na especificação ECMA atual.

Pode haver algumas discrepâncias entre a especificação do recurso e a implementação concluída. Essas diferenças são capturadas nas notas pertinentes da Language Design Meeting (LDM).

Você pode saber mais sobre o processo de adoção de especificações de recursos no padrão de linguagem C# no artigo sobre as especificações .

Resumo

Os requisitos do operador de turno serão flexibilizados para que o operando do lado direito não fique mais restrito a apenas int.

Motivação

Ao trabalhar com tipos diferentes de int, não é incomum que se faça um deslocamento usando o resultado de outro cálculo, como fazer o deslocamento com base no leading zero count. O tipo natural de algo como um leading zero count é o mesmo que o tipo de entrada (TSelf) e, portanto, em muitos casos, isso requer que você converta esse resultado em int antes de mudar, mesmo que esse resultado já esteja dentro do intervalo.

Dentro do contexto das interfaces matemáticas genéricas que as bibliotecas estão planejando expor, isso é potencialmente problemático, pois o tipo não é bem conhecido e, portanto, a conversão para int pode não ser possível ou mesmo bem definida.

Projeto detalhado

Operadores de turnos

§12.11 deve ser reformulado do seguinte modo:

- When declaring an overloaded shift operator, the type of the first operand must always be the class or struct containing the operator declaration,
and the type of the second operand must always be int.
+ When declaring an overloaded shift operator, the type of the first operand must always be the class or struct containing the operator declaration.

Ou seja, a restrição de que o primeiro operando seja a classe ou struct que contém a declaração do operador permanece. A restrição de que o segundo operando deve ser int é removida.

Operadores binários

§14.10.3 deve ser reformulado do seguinte modo:

-*  A binary `<<` or `>>` operator must take two parameters, the first of which must have type `T` or `T?` and the second of which must have type `int` or `int?`, and can return any type.
+*  A binary `<<` or `>>` operator must take two parameters, the first of which must have type `T` or `T?`, and can return any type.

Ou seja, a restrição de que o primeiro parâmetro seja T ou T? permanece. A restrição de que o segundo operando deve ser int ou int? foi removida.

Resolução de sobrecarga do operador binário

O primeiro ponto do §11.4.5 deve ser reformulado do seguinte modo:

  • O conjunto de operadores candidatos definidos pelo usuário fornecidos por X e Y para a operação operator op(x,y) é determinado. O conjunto consiste na união dos operadores candidatos fornecidos pela X e , a menos que o operador seja um operador de turno, os operadores candidatos fornecidos por Y, cada um determinado usando as regras dos operadores candidatos definidos pelo usuário §11.4.6. Se X e Y forem do mesmo tipo, ou se X e Y forem derivadas de um tipo de base comum, os operadores candidatos compartilhados só ocorrerão no conjunto combinado uma vez.

Ou seja, para os operadores por turnos, os operadores candidatos são apenas os fornecidos por tipo X.

Desvantagens

Os usuários poderão definir operadores que não seguem as diretrizes recomendadas, como a implementação de cout << "string" em C#.

Alternativas

As interfaces matemáticas genéricas que estão a ser expostas pelas bibliotecas poderiam, em vez disso, expor métodos nomeados explicitamente. Isso pode tornar o código mais difícil de ler/manter.

As interfaces matemáticas genéricas podem exigir que o turno tome int e que uma conversão seja realizada. Esta conversão pode ser dispendiosa ou não ser possível, dependendo do tipo em questão.

Questões por resolver

Há preocupação em preservar a "intenção" em torno do motivo pelo qual o segundo operando foi restrito a int?

Reuniões de design

https://github.com/dotnet/csharplang/blob/main/meetings/2022/LDM-2022-02-09.md