Partilhar via


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:

  1. O comportamento da função assíncrona de inclusão quando um awaiter implementa os métodos INotifyCompletion.OnCompleted de interface e ICriticalNotifyCompletion.UnsafeOnCompleted não faz com que o delegado de retomada seja invocado no máximo uma vez (§12.9.8.4).
  2. Passagem de ponteiros como parâmetros de referência ou de saída (§23.3).
  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).
  4. Quando o operador unário * é aplicado a um ponteiro que contém um valor inválido (§23.6.2).
  5. Quando um ponteiro é subscrito para acessar um elemento fora dos limites (§23.6.4).
  6. Modificar objetos de tipo gerenciado através de ponteiros fixos (§23.7).
  7. O conteúdo da memória recentemente alocada por stackalloc (§12.8.21).
  8. Tentar alocar um número negativo de itens usando stackalloc(§12.8.21).
  9. 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:

  1. O tratamento do caractere Unicode NULL (U+0000) em uma unidade de compilação. (§6.1)
  2. O comportamento quando um identificador que não está no Formulário de Normalização C é encontrado. (§6.4.3)
  3. O valor máximo permitido em Decimal_Digit+ PP_Line_Indicator. (§6.5.8)
  4. A interpretação do input_characters no texto-pp_pragma de uma diretiva #pragma. (§6.5.10)
  5. Os valores de quaisquer parâmetros de aplicativo passados pelo Main ambiente host antes da inicialização do aplicativo. (§7.1)
  6. O mecanismo para determinar se um programa é compilado como uma biblioteca de classes ou como um aplicativo. (§7.1)
  7. A política ou mecanismos usados por uma implementação para a criação e destruição de domínios de aplicativo. (§7.1)
  8. O código de saída se o método de ponto de entrada efetivo terminar devido a uma exceção. (§7.2)
  9. Se os finalizadores são ou não executados como parte do encerramento do aplicativo. (§7.2)
  10. Se as APIs permitem que um finalizador seja executado mais de uma vez. (§7.9)
  11. Se os finalizadores são ou não executados como parte do encerramento do aplicativo. (§7.9)
  12. A superfície da API fornecida por Expression<TDelegate> além do requisito para um Compile método. (§8.6)
  13. 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)
  14. O motivo pelo qual uma conversão para um tipo de delegado compatível pode falhar em tempo de compilação. (§10.7.3)
  15. O valor retornado quando uma alocação de pilha de tamanho zero é feita. (ponto 12.8.21)
  16. 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 um unchecked contexto e o operando esquerdo de uma divisão inteira é o máximo negativo int ou long valor e o operando direito é –1. (§12.10.3)
  17. Quando uma System.ArithmeticException (ou uma subclasse dela) é lançada ao executar uma operação decimal restante. (§12.10.4)
  18. 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)
  19. O mecanismo pelo qual a ligação a um método externo é alcançada. (§15.6.8)
  20. 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).
  21. Um ambiente de execução pode fornecer atributos adicionais que afetam a execução de um programa C#. (§22.5.1)
  22. Os mapeamentos entre ponteiros e inteiros. (§23.5.1)
  23. O efeito da aplicação do operador unário * a um null ponteiro. (§23.6.2)
  24. O comportamento quando a aritmética do ponteiro estoura o domínio do tipo de ponteiro. (§23.6.6, §23.6.7)
  25. O resultado do operador para tipos de sizeof valor não predefinidos. (ponto 23.6.9)
  26. O comportamento da instrução se a expressão de fixed matriz for null ou se a matriz tiver zero elementos. (§23.7)
  27. O comportamento da instrução se a expressão de cadeia de fixed caracteres for null. (§23.7)

B.4 Comportamento não especificado

  1. 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).
  2. A representação de true (§8.3.9).
  3. O valor do resultado ao converter valores fora do intervalo de float ou valores para um tipo integral em um unchecked contexto (§10.3.2double).
  4. 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).
  5. O layout de matrizes, exceto em um contexto inseguro (§12.8.16.5).
  6. 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).
  7. O momento exato da inicialização do campo estático (§15.5.6.2).
  8. O resultado de invocar MoveNext quando um objeto enumerador está em execução (§15.14.5.2).
  9. O resultado do acesso Current quando um objeto enumerador está nos estados antes, em execução ou depois (§15.14.5.3).
  10. O resultado de invocar Dispose quando um objeto enumerador está no estado de execução (§15.14.5.4).
  11. 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).
  12. A ordem pela qual os membros são embalados em uma estrutura (§23.6.9).
  13. Uma exceção ocorre durante a execução do finalizador, e essa exceção não é capturada (§21.4).
  14. Se mais de um membro corresponder, qual membro é a implementação de I.M (§18.6.5).

B.5 Outras questões

  1. 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).
  2. A CLI reserva determinadas assinaturas para compatibilidade com outras linguagens de programação (§15.3.10).

Fim do texto informativo.