如何在属性getter和带有一个参数的方法之间存在歧义?

dev*_*xer 12 .net c# compiler-errors ambiguity

我不敢相信我以前从未遇到过这个,但为什么我的代码会出现编译器错误?

public class Main
{
    public Main()
    {
        var ambiguous = new FooBar(1);
        var isConfused = ambiguous.IsValid; // this call is ambiguous
    }
}

public class FooBar
{
    public int DefaultId { get; set; }

    public FooBar(int defaultId)
    {
        DefaultId = defaultId;
    }

    public bool IsValid
    {
        get { return DefaultId == 0; }
    }

    public bool IsValid(int id)
    {
        return (id == 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

'FooBar.IsValid'和'FooBar.IsValid(int)'之间的歧义

为什么这个含糊不清?

我认为有两个原因不应该含糊不清:

  1. 之后没有父母IsConfused.
  2. 没有int参数IsConfused.

歧义在哪里?

Ree*_*sey 15

有错误是因为它声明使用是不明确的var.它可能是:

bool isConfused = ambiguous.IsValid;
Run Code Online (Sandbox Code Playgroud)

要么:

Func<int, bool> isConfused = ambiguous.IsValid;
Run Code Online (Sandbox Code Playgroud)

使用var要求编译器能够推断出确切的含义,在这种情况下,有两种可能性.

但是,如果删除,则var仍会出现(不同)错误,因为您不能拥有两个具有相同名称的成员,一个属性和一个方法.

  • @Jon,@ manojlds:当您输入*时,找出错误*的引擎*与构建*时错误是*的引擎略有不同的行为.特别是,前者试图处理代码不正确的情况*因为它正在被主动编辑*.在这些情况下,我们有试图检测和防止"级联"错误的启发式方法,其中从一个错误中恢复会导致另一个错误; 这可能是其中一种启发式的奇怪和未预料到的行为. (10认同)
  • 还有一个错误,因为您根本不允许定义两个具有相同名称的成员:) (8认同)

Kir*_*oll 6

你会得到那个特定的信息是令人困惑的,但是有两个同名的成员是不合法的(除了方法重载).这里您的属性和方法具有相同的名称.这与您不能拥有属性和具有相同名称的内部类的原因相同.字段,属性,方法和内部类都是封闭类型的成员,并且必须具有唯一的名称.