Abrandamento dos requisitos do operador de deslocamento
Nota
Este artigo é uma especificação de recurso. A especificação serve como o documento de design para o recurso. Ele inclui alterações de especificação propostas, juntamente com as informações necessárias durante o design e o desenvolvimento do recurso. Esses artigos são publicados até que as alterações de especificação 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 reunião de design de idioma (LDM).
Você pode saber mais sobre o processo de adoção de speclets de recursos no padrão de linguagem C# no artigo sobre as especificações de .
Resumo
Os requisitos do operador de deslocamento serão abrandados para que o operando do lado direito não fique mais restrito a ser apenas int
.
Motivação
Ao trabalhar com tipos diferentes de int
, não é incomum que você desloque usando o resultado de outra computação, como a mudança 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 exige que você converta esse resultado em int
antes de mudar, mesmo que esse resultado já esteja dentro do intervalo.
No 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 em int
pode não ser possível ou até mesmo bem definida.
Design detalhado
Operadores shift
§12.11 deve ser reformulado da seguinte maneira:
- 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.
Embora a restrição de que o segundo operando deve ser int
seja removida.
Operadores binários
§14.10.3 deve ser reformulado da seguinte maneira:
-* 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?
permaneça.
Embora a restrição de que o segundo operando deve ser int
ou int?
seja removida.
Resolução de sobrecarga do operador binário
O primeiro ponto de marcador em §11.4.5 deve ser reformulado da seguinte maneira:
- O conjunto de operadores definidos pelo usuário candidatos fornecidos por
X
eY
para a operaçãooperator op(x,y)
é determinado. O conjunto consiste na união dos operadores candidatos fornecidos porX
e , a menos que o operador seja um operador de deslocamento, os operadores candidatos fornecidos porY
, cada um determinado usando as regras de operadores definidos pelo usuário Candidato §11.4.6. SeX
eY
forem do mesmo tipo ou seX
eY
forem derivados de um tipo base comum, os operadores candidatos compartilhados só ocorrerão no conjunto combinado uma vez.
Ou seja, para operadores de deslocamento, os operadores candidatos são apenas aqueles fornecidos pelo tipo X
.
Inconvenientes
Os usuários poderão definir operadores que não seguem as diretrizes recomendadas, como implementar cout << "string"
em C#.
Alternativas
As interfaces matemáticas genéricas expostas pelas bibliotecas poderiam, em vez disso, disponibilizar métodos com nomes explícitos. Isso pode tornar o código mais difícil de ler/manter.
As interfaces matemáticas genéricas podem exigir que o deslocamento utilize int
e que uma conversão seja executada.
Essa conversão pode ser cara ou pode não ser possível dependendo do tipo em questão.
Perguntas não resolvidas
Há preocupação em preservar a "intenção" de por que 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
C# feature specifications