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.9.4).
  2. Passar ponteiros como ref ou out parâmetros (§24.3.2).
  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. (§24.5.1).
  4. Quando o operador unário * é aplicado a um ponteiro que contém um valor inválido (§24.6.2).
  5. Quando um ponteiro é subscrito para acessar um elemento fora dos limites (§24.6.4).
  6. Ao comparar valores de funcptr_types, ou void* cópias dos mesmos (§24.6.8.
  7. Modificar objetos de tipo gerenciado através de ponteiros fixos (§24.7).
  8. O conteúdo da memória recentemente alocada por stackalloc (§12.8.22).
  9. Tentar alocar um número negativo de itens usando stackalloc(§12.8.22).
  10. 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, §7.9)
  10. Se as APIs permitem que um finalizador seja executado mais de uma vez. (§7.9)
  11. O intervalo de tamanho e valor dos tipos nint e nuint. (§8.3.6)
  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. (§12.8.22)
  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.13.3)
  17. Quando uma System.ArithmeticException (ou uma subclasse dela) é lançada ao executar uma operação decimal restante. (§12.13.4)
  18. O mecanismo para distinguir a assinatura do acessório conjunto de uma propriedade da de um acessor init (§15.3.10.2).
  19. O mecanismo para distinguir a assinatura de acessório conjunto de um indexador da de um acessor init (§15.3.10.4).
  20. 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)
  21. O mecanismo pelo qual a ligação a um método externo é alcançada. (§15.6.8)
  22. 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. (ponto 22.4).
  23. O mapeamento de nomes de tokens e a semântica das convenções de chamada não geridas para além das exigidas por esta especificação, e o conjunto de combinações válidas desses tokens (§24.3.3).
  24. A ordem de execução dos inicializadores de módulo num módulo (§23.5.9).
  25. Um ambiente de execução pode fornecer atributos adicionais que afetam a execução de um programa C#. (§23.5.1)
  26. Os mapeamentos entre ponteiros e inteiros. (§24.5.1)
  27. O efeito da aplicação do operador unário * a um null ponteiro. (§24.6.2)
  28. O tipo de exceção lançada quando o primary_expression de um invocation_expression é um ponteiro de função com valor null, e é feita uma tentativa de invocar o método apontado (inexistente) (§12.8.10).
  29. O comportamento quando a aritmética do ponteiro estoura o domínio do tipo de ponteiro. (§24.6.6, §24.6.7)
  30. O resultado do operador para tipos de sizeof valor não predefinidos. (ponto 24.6.9)
  31. O comportamento da instrução se a expressão de fixed matriz for null ou se a matriz tiver zero elementos. (§24.7)
  32. O comportamento da instrução se a expressão de cadeia de fixed caracteres for null. (§24.7)
  33. O valor devolvido quando é feita uma alocação de pilha de tamanho zero (§12.8.22).

B.4 Comportamento não especificado

  1. O nome do método de ponto de entrada gerado para conter instruções de topo (§7.1.3).
  2. 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).
  3. A representação de true (§8.3.9).
  4. O valor do resultado ao converter valores fora do intervalo de float ou valores para um tipo integral em um double contexto (unchecked).
  5. 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).
  6. A disposição dos arrays, exceto num contexto inseguro (§12.8.17.5).
  7. Se existe alguma forma de executar o bloqueio de uma função anónima para além da avaliação e invocação da lambda_expression ou da expressão anonymous_method (§12.22.3).
  8. O momento exato da inicialização do campo estático (§15.5.6.2).
  9. O resultado de invocar MoveNext quando um objeto enumerador está em execução (§15.15.5.2).
  10. O resultado do acesso Current quando um objeto enumerador está nos estados antes, em execução ou depois (§15.15.5.3).
  11. O resultado de invocar Dispose quando um objeto enumerador está no estado de execução (§15.15.5.4).
  12. 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 (§23.3).
  13. A ordem pela qual os membros são embalados em uma estrutura (§24.6.9).
  14. Uma exceção ocorre durante a execução do finalizador, e essa exceção não é capturada (§22.4).
  15. Se mais de um membro corresponder, qual membro é o implementador (I.M§19.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. Algumas assinaturas são reservadas para compatibilidade com outras linguagens de programação (§15.3.10).

Fim do texto informativo.