Annex B Portability issues
This clause is informative.
B.1 General
This annex collects some information about portability that appears in this specification.
B.2 Undefined behavior
The behavior is undefined in the following circumstances:
- The behavior of the enclosing async function when an awaiter’s implementation of the interface methods
INotifyCompletion.OnCompletedandICriticalNotifyCompletion.UnsafeOnCompleteddoes not cause the resumption delegate to be invoked at most once (§11.8.8.4). - Passing pointers as
reforoutparameters (§22.3). - When dereferencing the result of converting one pointer type to another and the resulting pointer is not correctly aligned for the pointed-to type. (§22.5.1).
- When the unary
*operator is applied to a pointer containing an invalid value (§22.6.2). - When a pointer is subscripted to access an out-of-bounds element (§22.6.4).
- Modifying objects of managed type through fixed pointers (§22.7).
- The content of memory newly allocated by
stackalloc(§22.9). - Attempting to allocate a negative number of items using
stackalloc(§22.9).
B.3 Implementation-defined behavior
A conforming implementation is required to document its choice of behavior in each of the areas listed in this subclause. The following are implementation-defined:
- The behavior when an identifier not in Normalization Form C is encountered (§6.4.3).
- The interpretation of the input_characters in the pp_pragma-text of a #pragma directive (§6.5.9).
- The values of any application parameters passed to
Mainby the host environment prior to application startup (§7.1). - The precise structure of the expression tree, as well as the exact process for creating it, when an anonymous function is converted to an expression-tree (§10.7.3).
- Whether a
System.ArithmeticException(or a subclass thereof) is thrown or the overflow goes unreported with the resulting value being that of the left operand, when in anuncheckedcontext and the left operand of an integer division is the maximum negativeintorlongvalue and the right operand is–1(§11.9.3). - When a
System.ArithmeticException(or a subclass thereof) is thrown when performing a decimal remainder operation (§11.9.4). - The impact of thread termination when a thread has no handler for an exception, and the thread is itself terminated (§12.10.6).
- The impact of thread termination when no matching
catchclause is found for an exception and the code that initially started that thread is reached. (§20.4). - The mappings between pointers and integers (§22.5.1).
- The effect of applying the unary
*operator to anullpointer (§22.6.2). - The behavior when pointer arithmetic overflows the domain of the pointer type (§22.6.6, §22.6.7).
- The result of the
sizeofoperator for non-pre-defined value types (§22.6.9). - The behavior of the
fixedstatement if the array expression isnullor if the array has zero elements (§22.7). - The behavior of the
fixedstatement if the string expression isnull(§22.7). - The value returned when a stack allocation of size zero is made (§22.9).
B.4 Unspecified behavior
- The time at which the finalizer (if any) for an object is run, once that object has become eligible for finalization (§7.9).
- The value of the result when converting out-of-range values from
floatordoublevalues to an integral type in anuncheckedcontext (§10.3.2). - The exact target object and target method of the delegate produced from an anonymous_method_expression contains (§10.7.2).
- The layout of arrays, except in an unsafe context (§11.7.15.5).
- Whether there is any way to execute the block of an anonymous function other than through evaluation and invocation of the lambda_expression or anonymous_method-expression (§11.17.3).
- The exact timing of static field initialization (§14.5.6.2).
- The result of invoking
MoveNextwhen an enumerator object is running (§14.14.5.2). - The result of accessing
Currentwhen an enumerator object is in the before, running, or after states (§14.14.5.3). - The result of invoking
Disposewhen an enumerator object is in the running state (§14.14.5.4). - The attributes of a type declared in multiple parts are determined by combining, in an unspecified order, the attributes of each of its parts (§21.3).
- The order in which members are packed into a struct (§22.6.9).
- An exception occurs during finalizer execution, and that execution is not caught (§20.4).
- If more than one member matches, which member is the implementation of I.M. (§17.6.5)
B.5 Other Issues
- The exact results of floating-point expression evaluation can vary from one implementation to another, because an implementation is permitted to evaluate such expressions using a greater range and/or precision than is required. (§8.3.7)
- The CLI reserves certain signatures for compatibility with other programming languages. (§14.3.9.7)
End of informative text.
反馈
提交和查看相关反馈