【发布时间】:2021-01-30 13:21:47
【问题描述】:
在下面的代码中,CreateNode 调用第一个构造函数,正如 here 解释的那样(感谢链接)。
public class Node
{
public Node(Node parent = null, params Node[] children) { }
public Node(params Node[] children) { }
public Node CreateNode() => new Node(new Node(), new Node()); }
}
在保留跨用途构造函数功能的同时处理此问题的最佳方法是什么(它允许代码组合更具表现力,例如 XElement)。
我在想可能暂时包装或转换parent,但这显然会引入更多样板。不确定我是否可以以某种方式利用ValueTuple<> 语法来获得我想要的东西?还是隐式和显式运算符?!
编辑
我想以与 XElement 等类似的方式创建节点,例如
new Node(new Node(new Node())
但是在某些情况下,我已经创建了一个父节点并希望将其传递给其子节点的构造函数,例如
Node parent = new Node();
new Node(parent, new Node(), new Node());
显然编译器必须选择一个,所以我想我真的在问如何强制它选择另一个,所以它知道第一个参数应该被视为父级。
【问题讨论】:
-
所以你想改为调用第二个?
-
是的,我希望能够使用尽可能少的语法糖来选择其中一个!这更多的是启用简洁的编码风格而不是性能等问题,我想知道如何做到最好:0)
-
与您的问题无关,但为什么
parent参数是可选的?调用第一个重载并将null传递给parent与调用第二个重载不一样吗?在这两种情况下,您都在创建一个没有父节点的节点,对吧? -
我可能会创建一个有父节点的节点,一个有父节点和子节点的节点,或者一个只有子节点的节点。这两个构造函数涵盖了所有基础。我是一个尴尬的客户,对不起:-D
-
我还是不明白为什么
parent必须是可选的?现在你有两种方法可以创建没有父节点的节点...new Node(new [] { new Node() })(第二个构造函数)和new Node(null, new Node())(第一个构造函数)
标签: c# .net compilation