以下方法或属性之间的调用不明确

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)


RQD*_*QDQ 9

迫使它发挥作用的一种方法:

SomeClass sc = new SomeClass("Lorem ipsum", (Color?)null, (Font)null);
Run Code Online (Sandbox Code Playgroud)

  • 当你只有一个参数时它非常有用 (2认同)

Sha*_*ani 5

这是一个完美的例子anti-pattern,避免这种情况的最好方法是@Phil Klein 的回答。

这是将类传递为 null 的另一种语法:

SomeClass sc = new SomeClass("Lorem ipsum", null as Color, null as Font);
Run Code Online (Sandbox Code Playgroud)