【发布时间】:2020-05-14 23:35:01
【问题描述】:
有谁知道为什么 C# 中的匿名类型对ToString 使用如此复杂的实现?我相信早期版本使用了更简单的StringBuilder 实现。
这是来自 ILSpy 的 ToString 示例:
public override string ToString() {
object[] array = new object[2];
<a>j__TPar val = <a>i__Field;
ref <a>j__TPar reference = ref val;
<a>j__TPar val2 = default(<a>j__TPar);
object obj;
if (val2 == null) {
val2 = reference;
reference = ref val2;
if (val2 == null) {
obj = null;
goto IL_0046;
}
}
obj = reference.ToString();
goto IL_0046;
IL_0046:
array[0] = obj;
<b>j__TPar val3 = <b>i__Field;
ref <b>j__TPar reference2 = ref val3;
<b>j__TPar val4 = default(<b>j__TPar);
object obj2;
if (val4 == null) {
val4 = reference2;
reference2 = ref val4;
if (val4 == null) {
obj2 = null;
goto IL_0081;
}
}
obj2 = reference2.ToString();
goto IL_0081;
IL_0081:
array[1] = obj2;
return string.Format(null, "{{ a = {0}, b = {1} }}", array);
}
【问题讨论】:
-
我强烈不同意这是基于意见的,蝙蝠对你来说就是 StackOverflow。有人知道问题的实际情况,甚至可能有一个 Github 问题说明或提交说明更改...
-
每当
?.运算符应用于不受约束的类型参数时,C# 编译器都会生成带有引用分配的奇怪代码模式。 github.com/icsharpcode/ILSpy/issues/1050 -
@Daniel 谢谢,但我想知道这种模式的理由是什么。
标签: c# .net .net-core roslyn anonymous-types