附件 B 可移植性问题
此子句是信息性的。
B.1 常规
此附件收集有关此规范中显示的可移植性的某些信息。
B.2 未定义的行为
在以下情况下,行为未定义:
- 当 awaiter 实现接口方法
INotifyCompletion.OnCompleted
ICriticalNotifyCompletion.UnsafeOnCompleted
且不会导致恢复委托最多调用一次(§12.9.8.4)时,封闭异步函数的行为。 - 将指针作为引用或输出参数传递(§23.3)。
- 取消引用将一个指针类型转换为另一个指针类型的结果,并且生成的指针对于指向类型未正确对齐。 (§23.5.1)。
- 当一元
*
运算符应用于包含无效值的指针时(§23.6.2)。 - 当指针下标以访问超出边界元素时(§23.6.4)。
- 通过固定指针修改托管类型的对象(§23.7)。
- 新分配的
stackalloc
内存内容(§12.8.21)。 - 尝试使用
stackalloc
(§12.8.21) 分配负数项。 - 具有值参数(§12.6.4.2.2)的输入参数的隐式动态转换(§10.2.10)。
B.3 实现定义的行为
需要一个符合要求的实现来记录其在此子引用中列出的每个区域中的行为选择。 以下是实现定义的:
- 编译单元中的 Unicode NULL 字符(U+0000)的处理。 (§6.1)
- 遇到非规范化表单 C 中的标识符时的行为。 (§6.4.3)
- 允许的最大值
Decimal_Digit+
。PP_Line_Indicator
(§6.5.8) - #pragma 指令pp_pragma文本中input_characters的解释。 (§6.5.10)
- 在应用程序启动之前,主机环境传递给
Main
的任何应用程序参数的值。 (§7.1) - 用于确定程序是编译为类库还是应用程序的机制。 (§7.1)
- 实现用于创建和销毁应用程序域的策略或机制。 (§7.1)
- 如果有效的入口点方法因异常而终止,则退出代码。 (§7.2)
- 是否在应用程序终止过程中运行终结器。 (§7.2)
- API 是否允许多次运行终结器。 (§7.9)
- 是否在应用程序终止过程中运行终结器。 (§7.9)
- 超出
Expression<TDelegate>
方法要求Compile
提供的 API 图面。 (§8.6) - 当匿名函数转换为表达式树时,表达式树的精确结构以及创建表达式树的确切过程。 (§10.7.3)
- 转换为兼容委托类型的原因可能在编译时失败。 (§10.7.3)
- 创建大小为零的堆栈分配时返回的值。 (§12.8.21)
- 无论
System.ArithmeticException
引发(还是子类),或者溢出都未报告,结果值为左操作数,在unchecked
上下文中和整数除法的左操作数是最大值int
负数或long
值,右操作数为–1
。 (§12.10.3) System.ArithmeticException
执行十进制余数运算时(或子类)引发时。 (§12.10.4)- 当线程没有异常处理程序且线程本身终止时,线程终止的影响。 (§13.10.6)
- 实现与外部方法链接的机制。 (§15.6.8)
- 当找不到异常的匹配
catch
子句和最初启动该线程的代码时,线程终止的影响。 (§21.4)。 - 执行环境可以提供影响 C# 程序执行的其他属性。 (§22.5.1)
- 指针和整数之间的映射。 (§23.5.1)
- 将一元
*
运算符应用于null
指针的效果。 (§23.6.2) - 指针算术溢出指针类型的域时的行为。 (§23.6.6, §23.6.7)
- 非预定义值类型的运算符结果
sizeof
。 (§23.6.9) - 如果数组表达式为
null
或数组具有零个元素,则语句的行为fixed
。 (§23.7) - 如果字符串表达式为
null
.,则语句的行为fixed
。 (§23.7)
B.4 未指定的行为
- 运行对象的终结器(如果有)的时间,一旦该对象有资格进行最终化(§7.9)。
- (§8.3.9)的
true
表示形式。 - 在上下文中将超出范围的值
float
double
或值转换为上下文中的unchecked
整型类型时的结果值(§10.3.2)。 - 从 anonymous_method_expression 生成的委托的确切目标对象和目标方法包含 (§10.7.2)。
- 数组的布局,除了不安全的上下文(§12.8.16.5)。
- 无论是通过计算和调用lambda_expression还是anonymous_method表达式(§12.19.3)来执行匿名函数的块。
- 静态字段初始化的确切时间(§15.5.6.2)。
- 枚举器对象运行时调用
MoveNext
的结果(§15.14.5.2)。 - 枚举器对象处于状态(§15.14.5.3)之前、运行或之后访问
Current
的结果。 - 枚举器对象处于运行状态(§15.14.5.4)时调用
Dispose
的结果。 - 在多个部件中声明的类型的属性通过按未指定的顺序组合其每个部分的属性(§22.3)来确定。
- 成员打包到结构中的顺序(§23.6.9)。
- 在终结器执行期间发生异常,并且该异常未捕获(§21.4)。
- 如果多个成员匹配,则为该成员的
I.M
实现(§18.6.5)。
B.5 其他问题
信息性文本的结尾。