【问题标题】:The call is ambiguous between the following methods or properties以下方法或属性之间的调用不明确
【发布时间】:2012-02-09 08:33:47
【问题描述】:

假设我有这两个演员:

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)

【问题讨论】:

  • 两者都有的原因,还是这只是一个简化的例子?

标签: c# .net overloading


【解决方案1】:

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

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

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

【讨论】:

  • 这个效果很好,正是我想要的。
【解决方案2】:

强制它工作的一种方法:

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

【讨论】:

  • 只有一个参数时非常有用
  • @Eli 或无法更改 ctor。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    如果您的想法是您可以通过始终提供字符串然后可选地提供颜色或字体或两者来构造对象,那么这个怎么样:

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

    【讨论】:

      【解决方案5】:

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

      在我看来,我提到哪一个并不重要,因为最终结果是相同的

      调用模棱两可。每个构造函数都是唯一的——它们是否都创建和返回实例并不重要,因为每个构造函数中可能存在不同的逻辑。编译器仍然不知道你指的是哪个构造函数。

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2020-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多