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

本文关键字:调用 不明确 之间 属性 方法 | 更新日期: 2023-09-27 18:20:07

假设我有这两个因素:

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)

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

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

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

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

强制它工作的一种方法:

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

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

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

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

JetBrains Rider IDE问题

在我最近的案例中,JetBrains Rider在project_name.csproj中添加了对project_name的引用,从而产生自引用,并导致不时发生的构建错误:

<ItemGroup>
  <Reference Include="[project_name]">
    <HintPath>[path_to_dll_file]</HintPath>
  </Reference>
</ItemGroup>

解决方案是恢复这一添加。

您是否可以创建另一个只接受字符串的构造函数,并更新上面的构造函数,使其第二个参数成为强制性参数?

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

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

我会得到这个:";错误1以下方法或属性[…]"之间的调用不明确;

对我来说,很明显,我指的是哪一个并不重要,因为最终结果是相同的

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

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

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

我希望这能帮助那些将遇到与我的相同问题的读者

有时IDE的扩展程序(如OmniSharp)可能会报告此错误,
即使您的代码编译/是正确的
这就是我的情况。我重新启动它,假阳性错误消失了。