Ler em inglês

Compartilhar via


Cadeias de Caracteres Interpoladas Constantes

Observação

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 .

Problema do especialista: https://github.com/dotnet/csharplang/issues/2951

Resumo

Permite que constantes sejam geradas a partir de cadeias de caracteres interpoladas do tipo constante de string.

Motivação

O código a seguir já é legal:

public class C
{
    const string S1 = "Hello world";
    const string S2 = "Hello" + " " + "World";
    const string S3 = S1 + " Kevin, welcome to the team!";
}

No entanto, houve muitos pedidos da comunidade para tornar o seguinte também legal:

public class C
{
    const string S1 = $"Hello world";
    const string S2 = $"Hello{" "}World";
    const string S3 = $"{S1} Kevin, welcome to the team!";
}

Essa proposta representa a próxima etapa lógica para a geração de cadeia de caracteres constante, em que a sintaxe de cadeia de caracteres existente que funciona em outras situações é feita para funcionar para constantes.

Design detalhado

A seguir, representam as especificações atualizadas para expressões constantes nesta nova proposta. As especificações atuais das quais isso foi diretamente baseado podem ser encontradas em §12.23.

Expressões constantes

Uma expressão constante é uma expressão que pode ser completamente avaliada em tempo de compilação.

antlr
constant_expression
    : expression
    ;

Uma expressão constante deve ser o literal null ou um valor com um dos seguintes tipos: sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, object, stringou qualquer tipo de enumeração. Somente os seguintes constructos são permitidos em expressões constantes:

  • Literais (incluindo o literal null).
  • Referências a membros const de tipos de classe e estrutura.
  • Referências a membros de tipos de enumeração.
  • Referências a parâmetros de const ou variáveis locais
  • Subexpressões entre parênteses, que são expressões constantes.
  • Expressões cast, desde que o tipo de destino seja um dos tipos listados acima.
  • expressões checked e unchecked
  • Expressões de valor padrão
  • Expressões nameof
  • Os operadores unários predefinidos +, -, !e ~.
  • Os operadores binários predefinidos +, -, *, /, %, <<, >>, &, |, ^, &&, ||, ==, !=, <, >, <=e >= binários, desde que cada operando seja de um tipo listado acima.
  • O operador condicional ?:.
  • cadeias de caracteres interpoladas ${}, desde que todos os componentes sejam expressões constantes do tipo string e todos os componentes interpolados não tenham especificadores de alinhamento e formato.

As seguintes conversões são permitidas em expressões constantes:

  • Conversões de identidade
  • Conversões numéricas
  • Conversões de enumeração
  • Conversões de expressão constante
  • Conversões de referência implícitas e explícitas, desde que a origem das conversões seja uma expressão constante que é avaliada como o valor nulo.

Outras conversões, incluindo boxing, unboxing e conversões de referência implícita de valores que não sejam nulos, não são permitidas em expressões constantes. Por exemplo:

C#
class C 
{
    const object i = 5;         // error: boxing conversion not permitted
    const object str = "hello"; // error: implicit reference conversion
}

a inicialização de i é um erro porque uma conversão de boxing é necessária. A inicialização do str é um erro porque é necessária uma conversão de referência implícita de um valor não nulo.

Sempre que uma expressão atende aos requisitos listados acima, a expressão é avaliada em tempo de compilação. Isso é verdadeiro mesmo se a expressão for uma subexpressão de uma expressão maior que contenha construções não constantes.

A avaliação em tempo de compilação de expressões constantes usa as mesmas regras que a avaliação em tempo de execução de expressões não constantes, exceto quando a avaliação em tempo de execução teria gerado uma exceção, a avaliação em tempo de compilação faz com que ocorra um erro de tempo de compilação.

A menos que uma expressão constante seja explicitamente colocada em um contexto unchecked, estouros que ocorrem em operações e conversões aritméticas de tipo integral durante a avaliação em tempo de compilação da expressão sempre causam erros de tempo de compilação (§12.23).

Expressões constantes ocorrem nos contextos listados abaixo. Nesses contextos, ocorrerá um erro em tempo de compilação se uma expressão não puder ser totalmente avaliada em tempo de compilação.

  • Declarações constantes (§15,4).
  • Declarações de membro de enumeração (§19.4).
  • Argumentos padrão de listas de parâmetros formais (§15.6.2)
  • Rótulos case de uma instrução switch (§13.8.3).
  • Instruções goto case (§13.10.4).
  • Comprimento das dimensões em uma expressão de criação de matriz (§12.8.17.5) que inclui um inicializador.
  • Atributos (§22).

Uma conversão de expressão constante implícita (§10.2.11) permite que uma expressão constante do tipo int seja convertida em sbyte, byte, short, ushort, uintou ulong, desde que o valor da expressão constante esteja dentro do intervalo do tipo de destino.

Inconvenientes

Esta proposta adiciona complexidade adicional ao compilador em troca de aplicabilidade mais ampla de cadeias de caracteres interpoladas. Como essas cadeias de caracteres são totalmente avaliadas em tempo de compilação, os valiosos recursos de formatação automática de cadeias de caracteres interpoladas são menos neccesários. A maioria dos casos de uso pode ser replicada em grande parte por meio das alternativas abaixo.

Alternativas

O operador + atual para concatenação de cadeia de caracteres pode combinar cadeias de caracteres de maneira semelhante à proposta atual.

Perguntas não resolvidas

Quais partes do projeto ainda estão indecisas?

Reuniões de design

Vincule às notas de design que afetam essa proposta e descreva em uma frase para cada uma quais mudanças elas causaram.