Anexo B Questões de portabilidade
Esta cláusula é informativa.
B.1 Generalidades
O presente anexo recolhe algumas informações sobre a portabilidade que figuram nesta especificação.
B.2 Comportamento indefinido
O comportamento é indefinido nas seguintes circunstâncias:
- O comportamento da função assíncrona de inclusão quando um awaiter implementa os métodos
INotifyCompletion.OnCompleted
de interface eICriticalNotifyCompletion.UnsafeOnCompleted
não faz com que o delegado de retomada seja invocado no máximo uma vez (§12.9.8.4). - Passagem de ponteiros como parâmetros de referência ou de saída (§23.3).
- Ao desreferenciar o resultado da conversão de um tipo de ponteiro para outro e o ponteiro resultante não está alinhado corretamente para o tipo apontado. (§23.5.1).
- Quando o operador unário
*
é aplicado a um ponteiro que contém um valor inválido (§23.6.2). - Quando um ponteiro é subscrito para acessar um elemento fora dos limites (§23.6.4).
- Modificar objetos de tipo gerenciado através de ponteiros fixos (§23.7).
- O conteúdo da memória recentemente alocada por
stackalloc
(§12.8.21). - Tentar alocar um número negativo de itens usando
stackalloc
(§12.8.21). - Conversões dinâmicas implícitas (§10.2.10) de parâmetros de entrada com argumentos de valor (§12.6.4.2).
B.3 Comportamento definido pela implementação
Uma implementação em conformidade é necessária para documentar sua escolha de comportamento em cada uma das áreas listadas nesta subcláusula. Os seguintes são definidos pela implementação:
- O tratamento do caractere Unicode NULL (U+0000) em uma unidade de compilação. (§6.1)
- O comportamento quando um identificador que não está no Formulário de Normalização C é encontrado. (§6.4.3)
- O valor máximo permitido em
Decimal_Digit+
PP_Line_Indicator
. (§6.5.8) - A interpretação do input_characters no texto-pp_pragma de uma diretiva #pragma. (§6.5.10)
- Os valores de quaisquer parâmetros de aplicativo passados pelo
Main
ambiente host antes da inicialização do aplicativo. (§7.1) - O mecanismo para determinar se um programa é compilado como uma biblioteca de classes ou como um aplicativo. (§7.1)
- A política ou mecanismos usados por uma implementação para a criação e destruição de domínios de aplicativo. (§7.1)
- O código de saída se o método de ponto de entrada efetivo terminar devido a uma exceção. (§7.2)
- Se os finalizadores são ou não executados como parte do encerramento do aplicativo. (§7.2)
- Se as APIs permitem que um finalizador seja executado mais de uma vez. (§7.9)
- Se os finalizadores são ou não executados como parte do encerramento do aplicativo. (§7.9)
- A superfície da API fornecida por
Expression<TDelegate>
além do requisito para umCompile
método. (§8.6) - A estrutura precisa da árvore de expressão, bem como o processo exato para criá-la, quando uma função anônima é convertida em uma árvore de expressão. (§10.7.3)
- O motivo pelo qual uma conversão para um tipo de delegado compatível pode falhar em tempo de compilação. (§10.7.3)
- O valor retornado quando uma alocação de pilha de tamanho zero é feita. (ponto 12.8.21)
- Se um
System.ArithmeticException
(ou uma subclasse dele) é lançado ou o estouro não é relatado com o valor resultante sendo o do operando esquerdo, quando em umunchecked
contexto e o operando esquerdo de uma divisão inteira é o máximo negativoint
oulong
valor e o operando direito é–1
. (§12.10.3) - Quando uma
System.ArithmeticException
(ou uma subclasse dela) é lançada ao executar uma operação decimal restante. (§12.10.4) - O impacto da terminação de thread quando um thread não tem manipulador para uma exceção e o próprio thread é encerrado. (ponto 13.10.6)
- O mecanismo pelo qual a ligação a um método externo é alcançada. (§15.6.8)
- O impacto da terminação de thread quando nenhuma cláusula correspondente
catch
é encontrada para uma exceção e o código que iniciou inicialmente esse thread é alcançado. (§21.4). - Um ambiente de execução pode fornecer atributos adicionais que afetam a execução de um programa C#. (§22.5.1)
- Os mapeamentos entre ponteiros e inteiros. (§23.5.1)
- O efeito da aplicação do operador unário
*
a umnull
ponteiro. (§23.6.2) - O comportamento quando a aritmética do ponteiro estoura o domínio do tipo de ponteiro. (§23.6.6, §23.6.7)
- O resultado do operador para tipos de
sizeof
valor não predefinidos. (ponto 23.6.9) - O comportamento da instrução se a expressão de
fixed
matriz fornull
ou se a matriz tiver zero elementos. (§23.7) - O comportamento da instrução se a expressão de cadeia de
fixed
caracteres fornull
. (§23.7)
B.4 Comportamento não especificado
- O momento em que o finalizador (se houver) de um objeto é executado, uma vez que esse objeto se tornou elegível para finalização (§7.9).
- A representação de
true
(§8.3.9). - O valor do resultado ao converter valores fora do intervalo de
float
ou valores para um tipo integral em umunchecked
contexto (§10.3.2double
). - O objeto de destino exato e o método de destino do delegado produzido a partir de um anonymous_method_expression contém (§10.7.2).
- O layout de matrizes, exceto em um contexto inseguro (§12.8.16.5).
- Se existe alguma forma de executar o bloco de uma função anónima que não seja através da avaliação e invocação da lambda_expression ou anonymous_method-expressão (§12.19.3).
- O momento exato da inicialização do campo estático (§15.5.6.2).
- O resultado de invocar
MoveNext
quando um objeto enumerador está em execução (§15.14.5.2). - O resultado do acesso
Current
quando um objeto enumerador está nos estados antes, em execução ou depois (§15.14.5.3). - O resultado de invocar
Dispose
quando um objeto enumerador está no estado de execução (§15.14.5.4). - Os atributos de um tipo declarado em várias partes são determinados pela combinação, numa ordem não especificada, dos atributos de cada uma das suas partes (§22.3).
- A ordem pela qual os membros são embalados em uma estrutura (§23.6.9).
- Uma exceção ocorre durante a execução do finalizador, e essa exceção não é capturada (§21.4).
- Se mais de um membro corresponder, qual membro é a implementação de
I.M
(§18.6.5).
B.5 Outras questões
- Os resultados exatos da avaliação de expressões de vírgula flutuante podem variar de uma implementação para outra, porque uma implementação é permitida para avaliar tais expressões usando um alcance e/ou precisão maior do que o necessário (§8.3.7).
- A CLI reserva determinadas assinaturas para compatibilidade com outras linguagens de programação (§15.3.10).
Fim do texto informativo.
Colabore connosco no GitHub
A origem deste conteúdo pode ser encontrada no GitHub, onde também pode criar e rever problemas e pedidos Pull. Para mais informações, consulte o nosso guia do contribuidor.
ECMA C# draft specification