Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#对象初始化_C# - Fatal编程技术网

C#对象初始化

C#对象初始化,c#,C#,具有这种代码的程序: var subtree = new Tree<int>(5, EnumeratorOrder.BreadthFirstSearch) { 1, 2 }; var tree = new Tree<int>(7, EnumeratorOrder.BreadthFirstSearch) { subtree, 10, 15 }; var子树=新树(5,EnumeratorOrder.BroadthFirstSearch){1,2}; var-tree=新

具有这种代码的程序:

var subtree = new Tree<int>(5, EnumeratorOrder.BreadthFirstSearch) { 1, 2 };

var tree = new Tree<int>(7, EnumeratorOrder.BreadthFirstSearch) { subtree, 10, 15 };
var子树=新树(5,EnumeratorOrder.BroadthFirstSearch){1,2};
var-tree=新树(7,EnumeratorOrder.BroadthFirstSearch){subtree,10,15};
我不明白什么是
{1,2}

我不明白{1,2}是什么意思

{1,2}

它们代表了

var temp = new Tree<int>(5, EnumeratorOrder.BreadthFirstSearch);
temp.Add(1);
temp.Add(2);

var subtree = temp;
var temp=新树(5,EnumeratorOrder.BroadthFirstSearch);
临时添加(1);
临时添加(2);
var子树=温度;
关于
temp
初始赋值的注释:赋值的含义是评估左侧,评估右侧,执行赋值。评估权利会产生副作用,这些影响必须在分配生效之前排序。有关完整的讨论,请参阅评论。

这是一个问题

集合初始值设定项允许您在初始化实现IEnumerable的集合类或具有Add扩展方法的类时指定一个或多个元素初始值设定项。元素初始值设定项可以是简单值、表达式或对象初始值设定项。通过使用集合初始值设定项,您不必在源代码中指定对类的Add方法的多次调用;编译器添加这些调用


最接近的答案,并将OP指向类树应该做什么/拥有什么才能启用此功能。虽然这让人明白了这一点,但我注意到
子树
直到
添加
调用之后才分配。这实际上是
var temp=new;临时添加(1);临时添加(2);var子树=温度@EricLippert:谢谢你的来电。相应地更新了我的答案。为什么使用临时变量?我天真的假设是编译器可以强制执行“分配和分配子树,调用subtree.Add(1),调用subtree.Add(2)”的顺序;您个人喜欢使用该值作为局部变量声明的初始值,这是关于您的事实,而不是关于集合初始值设定项。该值可以是一个操作数、一个参数,也可以只是被丢弃;第二,假设有一个
Add
s抛出,并且赋值给一个字段。您是否希望赋值已成功,并且对于即使其中一个add抛出也能看到该字段的代码可见?为什么要在没有成功添加的情况下将该字段分配给集合?这看起来很奇怪,而且容易出错。第三,这应该做什么
Y=newy(){M(Y)}其中变量为局部变量。根据您的建议,这应该有效,并且应该在调用
Add
之前将
new Y()
传递到
M
。这似乎很糟糕。如果表达式生成一个临时值,则在调用
Add
时不会分配
y
,因此此代码是编译时错误,应该是这样的。