Problemas de portabilidad del anexo B

Esta cláusula es informativa.

B.1 General

Este anexo recopila información sobre la portabilidad que aparece en esta especificación.

B.2 Comportamiento indefinido

El comportamiento no está definido en las siguientes circunstancias:

  1. El comportamiento de la función asincrónica envolvente cuando la implementación de un awaiter de los métodos INotifyCompletion.OnCompleted de interfaz y ICriticalNotifyCompletion.UnsafeOnCompleted no hace que el delegado de reanudación se invoque como máximo una vez (§12.9.9.4).
  2. Pasar punteros como ref parámetros (out§24.3.2).
  3. Al desreferenciar el resultado de convertir un tipo de puntero a otro y el puntero resultante no se alinea correctamente para el tipo señalado. (§24.5.1).
  4. Cuando el operador unario * se aplica a un puntero que contiene un valor no válido (§24.6.2).
  5. Cuando se subíndice un puntero para acceder a un elemento no enlazado (§24.6.4).
  6. Al comparar valores de funcptr_types o void* copias de los mismos (§24.6.8).
  7. Modificar objetos de tipo administrado a través de punteros fijos (§24.7).
  8. El contenido de la memoria recién asignada por stackalloc (§12.8.22).
  9. Intentar asignar un número negativo de elementos mediante stackalloc(§12.8.22).
  10. Conversiones dinámicas implícitas (§10.2.10) de parámetros de entrada con argumentos de valor (§12.6.4.2).

B.3 Comportamiento definido por la implementación

Se requiere una implementación conforme para documentar su elección de comportamiento en cada una de las áreas enumeradas en esta subclausa. A continuación se definen las implementaciones:

  1. Control del carácter Unicode NULL (U+0000) en una unidad de compilación. (§6.1)
  2. Comportamiento cuando se encuentra un identificador que no está en el formulario de normalización C. (§6.4.3)
  3. Valor máximo permitido para Decimal_Digit+ en PP_Line_Indicator. (§6.5.8)
  4. Interpretación del input_characters en el texto pp_pragma de una directiva #pragma. (§6.5.10)
  5. Los valores de los parámetros de aplicación pasados Main por el entorno host antes del inicio de la aplicación. (§7.1)
  6. Mecanismo para determinar si un programa se compila como una biblioteca de clases o como una aplicación. (§7.1)
  7. Directiva o mecanismos utilizados por una implementación para la creación y destrucción de dominios de aplicación. (§7.1)
  8. Código de salida si el método de punto de entrada efectivo finaliza debido a una excepción. (§7.2)
  9. Indica si los finalizadores se ejecutan como parte de la terminación de la aplicación. (§7.2, §7.9)
  10. Si las API permiten ejecutar un finalizador más de una vez. (§7.9)
  11. El tamaño y el intervalo de valores de los tipos nint y nuint. (§8.3.6)
  12. Superficie de API proporcionada por Expression<TDelegate> más allá del requisito de un Compile método. (§8.6)
  13. Estructura precisa del árbol de expresiones, así como el proceso exacto para crearlo, cuando se convierte una función anónima en un árbol de expresiones. (§10.7.3)
  14. La razón por la que se puede producir un error en una conversión a un tipo de delegado compatible en tiempo de compilación. (§10.7.3)
  15. Valor devuelto cuando se realiza una asignación de pila de tamaño cero. (§12.8.22)
  16. System.ArithmeticException Si se produce (o una subclase de ahí) o el desbordamiento no se notifica con el valor resultante que es el del operando izquierdo, cuando en un unchecked contexto y el operando izquierdo de una división de enteros es el valor máximo negativo int o long el valor y el operando derecho es –1. (§12.13.3)
  17. System.ArithmeticException Cuando se produce una (o una subclase) al realizar una operación de resto decimal. (§12.13.4)
  18. Mecanismo para distinguir la firma de descriptor de acceso set de una propiedad de la de un descriptor de acceso init (§15.3.10.2).
  19. Mecanismo para distinguir la firma de descriptor de acceso del conjunto de un indexador de la de un descriptor de acceso init (§15.3.10.4).
  20. Impacto de la terminación del subproceso cuando un subproceso no tiene ningún controlador para una excepción y el subproceso finaliza. (§13.10.6)
  21. Mecanismo por el que se logra la vinculación a un método externo. (§15.6.8)
  22. El impacto de la terminación del subproceso cuando no se encuentra ninguna cláusula coincidente catch para una excepción y el código que inicialmente inició ese subproceso se alcanza. (§22.4).
  23. La asignación de nombres de token y la semántica de las convenciones de llamada no administradas más allá de las requeridas por esta especificación y el conjunto de combinaciones válidas de esos tokens (§24.3.3).
  24. Orden de ejecución de inicializadores de módulo en un módulo (§23.5.9).
  25. Un entorno de ejecución puede proporcionar atributos adicionales que afectan a la ejecución de un programa de C#. (§23.5.1)
  26. Asignaciones entre punteros y enteros. (§24.5.1)
  27. Efecto de aplicar el operador unario * a un null puntero. (§24.6.2)
  28. El tipo de excepción que se produce cuando el primary_expression de un invocation_expression es un puntero de función con el valor nully se intenta invocar el método (no existente) al método (§12.8.10).
  29. El comportamiento cuando la aritmética de puntero desborda el dominio del tipo de puntero. (§24.6.6, §24.6.7)
  30. Resultado del sizeof operador para los tipos de valor no predefinidos. (§24.6.9)
  31. Comportamiento de la fixed instrucción si la expresión de matriz es null o si la matriz tiene cero elementos. (§24.7)
  32. Comportamiento de la fixed instrucción si la expresión de cadena es null. (§24.7)
  33. Valor devuelto cuando se realiza una asignación de pila de tamaño cero (§12.8.22).

B.4 Comportamiento no especificado

  1. Nombre del método de punto de entrada generado para contener instrucciones de nivel superior (§7.1.3).
  2. Hora en la que se ejecuta el finalizador (si existe) para un objeto, una vez que ese objeto se ha convertido en apto para la finalización (§7.9).
  3. Representación de true (§8.3.9).
  4. Valor del resultado al convertir valores fuera del intervalo de valores de float o a un tipo entero en un double contexto (unchecked).
  5. El objeto de destino exacto y el método de destino del delegado generado a partir de un anonymous_method_expression contiene (§10.7.2).
  6. Diseño de matrices, excepto en un contexto no seguro (§12.8.17.5).
  7. Si hay alguna manera de ejecutar el bloque de una función anónima distinta de la evaluación e invocación de la lambda_expression o anonymous_method-expression (§12.22.3).
  8. El tiempo exacto de inicialización de campos estáticos (§15.5.6.2).
  9. Resultado de invocar MoveNext cuando se ejecuta un objeto enumerador (§15.15.5.2).
  10. El resultado de acceder a Current cuando un objeto enumerador está en los estados de antes, durante o después (§15.15.5.3).
  11. Resultado de invocar Dispose cuando un objeto enumerador está en estado de ejecución (§15.15.5.4).
  12. Los atributos de un tipo declarado en varias partes se determinan combinando, en un orden no especificado, los atributos de cada una de sus partes (§23.3).
  13. Orden en el que los miembros se empaquetan en una estructura (§24.6.9).
  14. Se produce una excepción durante la ejecución del finalizador y esa excepción no se detecta (§22.4).
  15. Si más de un miembro coincide, qué miembro es la implementación de I.M (§19.6.5).

B.5 Otros problemas

  1. Los resultados exactos de la evaluación de expresiones de punto flotante pueden variar de una implementación a otra, ya que se permite que una implementación evalúe dichas expresiones mediante un intervalo mayor o una precisión de los necesarios (§8.3.7).
  2. Algunas firmas están reservadas para la compatibilidad con otros lenguajes de programación (§15.3.10).

Fin del texto informativo.