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

时间:2012-01-13 03:23:10

标签: c# .net overloading

假设我有这两个人:

public SomeClass(string a, Color? c = null, Font d = null)
        {
            // ...
        }

public SomeClass(string a, Font c = null, Color? d = null)
        {
            // ...
        }

〜我这样做:

SomeClass sc = new SomeClass("Lorem ipsum");

我会得到这个:“错误1以下方法或属性之间的调用是不明确的[...]”

对我而言,似乎我所指的是哪一个并不重要,因为最终结果是相同的(至少在这个特殊情况下,对我来说,这就是现在最重要的事情),那么我的选择是什么绕过这个?

编辑1: @oltman:简化示例。

我只想写

[...] new SomeClass("Lorem", Color.Green)

而不是

[...] new SomeClass("Lorem", null, Color.Green)

6 个答案:

答案 0 :(得分:23)

两个构造函数都采用相同数量的参数,但顺序不同。由于您已为两个构造函数参数指定了默认值,因此当未提供第二个参数时,编译器无法区分这两个重载。

我建议你删除现有的构造函数并替换为以下内容:

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) {}

答案 1 :(得分:9)

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

SomeClass sc = new SomeClass("Lorem ipsum", (Color?)null, (Font)null);

答案 2 :(得分:2)

这是anti-pattern的完美示例,避免这种情况的最佳方式是@Phil Klein的回答。

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

SomeClass sc = new SomeClass("Lorem ipsum", null as Color, null as Font);

答案 3 :(得分:1)

你能创建另一个只接受字符串的构造函数,并更新上面的构造函数以使其第二个参数成为必需的吗?

如果想法是你可以通过提供字符串然后可选地提供颜色或字体或两者来构造对象,那么:

public SomeClass(string a)
        {
            // ...
        }

public SomeClass(string a, Color? c)
        {
            // ...
        }

public SomeClass(string a, Font f, Color? d = null)
        {
            // ...
        }

答案 4 :(得分:0)

  

我会得到这个:“错误1以下方法或属性之间的调用是不明确的[...]”

     

我觉得很明显,我所指的是哪一个并不重要,因为最终结果是相同的

电话 不明确。每个构造函数都是唯一的 - 如果它们都创建并返回一个实例并不重要,因为每个构造函数中可能有不同的逻辑。编译器仍然不知道你的意思是哪个构造函数。

答案 5 :(得分:0)

我在安装 PnP.Framework(SharePointPnPCoreOnline 的替代品)后遇到了这个问题

我可以通过卸载从我的项目文件中安装的 SharePointPnPCoreOnline 来删除它,并尝试清理和构建然后错误消失

希望对遇到和我一样问题的读者有所帮助