13

これまで一度も遭遇したことがないとは信じられませんが、このコードでコンパイラ エラーが発生するのはなぜですか?

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

エラーメッセージは次のとおりです。

「FooBar.IsValid」と「FooBar.IsValid(int)」の間のあいまいさ

なぜこれがあいまいなのですか?

あいまいであってはならない2つの理由があると思います。

  1. の後に括弧はありませんIsConfused
  2. の int 引数はありませんIsConfused

あいまいさはどこにありますか?

4

4 に答える 4

16

を使用して宣言されているため、あいまいであるため、エラーがありますvar。かもしれない:

bool isConfused = ambiguous.IsValid;

または:

Func<int, bool> isConfused = ambiguous.IsValid;

を使用varするには、コンパイラが正確な意味を推測できる必要があります。この場合、2 つの可能性があります。

ただし、 を削除してvarも、同じ名前の 2 つのメンバー (1 つはプロパティ、もう 1 つはメソッド) を持つことはできないため、(異なる) エラーが発生します。

于 2011-07-07T19:43:58.567 に答える
6

その特定のメッセージを受け取ると混乱しますが、同じ名前の 2 つのメンバーを持つことは合法ではありません (メソッドのオーバーロードを除く)。ここで、プロパティとメソッドは同じ名前です。これは、同じ名前のプロパティと内部クラスを持つことができないのと同じ理由です。フィールド、プロパティ、メソッド、および内部クラスはすべて、外側の型のメンバーであり、一意の名前を持つ必要があります。

于 2011-07-07T19:43:50.943 に答える
0

「FooBar には既に IsValid の定義が含まれています」というエラーが表示されます。

于 2011-07-07T19:45:15.480 に答える
-1

最初は、メソッドを呼び出しているのか、プロパティを使用しているのかをコンパイラが常に把握できるように見えるかもしれません。結局のところ、メソッドの後には括弧があり、プロパティにはありません。

しかし、それは持ちこたえません。括弧なしでメソッドを使用できます。

void Foo() { ... }
void Bar(Action action) { ... }

Bar(Foo);

また、括弧付きのプロパティを使用できます。

Action MyProperty { get; set; }

MyProperty();

あいまいさがないことを確認する唯一の方法は、同じ名前のメソッドとプロパティを持つことを禁止することです。

于 2011-07-07T19:46:52.780 に答える