Ago*_*ous 18 .net c# overloading
假设我有这两个ctors:
public SomeClass(string a, Color? c = null, Font d = null)
{
// ...
}
public SomeClass(string a, Font c = null, Color? d = null)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
〜我这样做:
SomeClass sc = new SomeClass("Lorem ipsum");
Run Code Online (Sandbox Code Playgroud)
我会得到这个:"错误1以下方法或属性之间的调用是不明确的[...]"
对我来说似乎很明显,我所指的是哪一个并不重要,因为最终结果是相同的(至少在这个特殊情况下,对我而言,这就是现在最重要的事情),那么我有什么选择可以绕过这个?
编辑1:@oltman:简化示例.
我只想写
[...] new SomeClass("Lorem", Color.Green)
Run Code Online (Sandbox Code Playgroud)
代替
[...] new SomeClass("Lorem", null, Color.Green)
Run Code Online (Sandbox Code Playgroud)
Phi*_*ein 26
两个构造函数都采用相同数量的参数,但顺序不同.由于您已为两个构造函数参数指定了缺省值,因此在未提供第二个参数时,编译器无法区分这两个重载.
我建议你删除现有的构造函数并替换为以下内容:
public SomeClass(string a, Color? color, Font font)
{
// constructor implementation
}
public SomeClass(string a) : this(a, null, null) {}
public SomeClass(string a, Color color) : this(a, color, null) {}
public SomeClass(string a, Font font) : this(a, null, font) {}
Run Code Online (Sandbox Code Playgroud)
迫使它发挥作用的一种方法:
SomeClass sc = new SomeClass("Lorem ipsum", (Color?)null, (Font)null);
Run Code Online (Sandbox Code Playgroud)
这是一个完美的例子anti-pattern,避免这种情况的最好方法是@Phil Klein 的回答。
这是将类传递为 null 的另一种语法:
SomeClass sc = new SomeClass("Lorem ipsum", null as Color, null as Font);
Run Code Online (Sandbox Code Playgroud)