Wie kann es sein, Ambiguität zwischen einem Eigenschafts-getter und einer Methode mit einem argument?
Ich kann nicht glauben, dass ich noch nie über diese vor, aber warum bekomme ich einen compiler-Fehler für diesen code?
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);
}
}
Hier ist die Fehlermeldung:
Mehrdeutigkeit zwischen 'FooBar.IsValid " und " FooBar.IsValid(int)'
Warum ist diese mehrdeutig?
Ich denke es gibt zwei Gründe, es sollte nicht zweideutig sein:
- Es gibt keine parenthases nach
IsConfused
. - Es gibt keine int-argument für
IsConfused
.
Wo ist die Unklarheit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es Fehler, weil es mehrdeutig ist, da ist es erklärt mit
var
. Es könnte sein,:Oder:
Mit
var
erfordert, dass der compiler in der Lage sein, um Rückschlüsse auf die genaue Bedeutung, und in diesem Fall gibt es zwei Möglichkeiten.Jedoch, wenn Sie entfernen die
var
, erhalten Sie noch eine (andere) Fehlermeldung, da Sie nicht zwei Mitglieder mit dem gleichen Namen einer Eigenschaft und einer Methode.var
gar nicht existieren .NET 1. Den zweiten Fehler habe ich erwähnt, wäre das eine hätte er erhielt in frühen Versionen .NET.var
zubool
in Ihrer Linie, wie dies deutet darauf hin, du wirst sehen, die zweite Fehlermeldung angezeigt.Func
Ausdruck ohne Verwendung eines lambda, so das Szenario, das Sie erwähnt hätte nie aufgetreten zu mir. Interessante Sachen.Es ist verwirrend, die Sie erhalten würden, dass bestimmte Nachricht, aber es ist nicht legal, haben zwei Mitglieder mit dem gleichen Namen (ausgenommen die Methode überladen). Hier werden Ihre Eigenschaft und Methode den gleichen Namen haben. Dies ist der gleiche Grund, man kann nicht eine Eigenschaft und eine innere Klasse mit dem gleichen Namen. Felder, Eigenschaften, Methoden und innere Klassen sind alle Mitglieder des einschließenden Typs und müssen eindeutige Namen haben.
Main
(nicht aufFooBar
), aber wenn ich auskommentiert die betreffende Zeile inMain
und kompiliert, dann bekam ich einen Fehler fürFooBar
('Foobar' enthält bereits eine definition fürIsValid
). Es ist merkwürdig, dass der Fehler in der main scheint zu vertuschen, die Fehler inFooBar
.int Foo { get; set; }
undint get_Foo() { return 0; }
wird auch zu einer Kollision.Würden Sie eine Fehlermeldung erhalten, dass "FooBar enthält bereits eine definition für IsValid"
Zunächst könnte es scheinen, dass der compiler könnte immer herauszufinden, ob Sie den Aufruf der Methode oder die Eigenschaft-nach all der Methode in Klammern nach, und die Eigenschaft nicht.
Nicht halten, obwohl. Sie können eine Methode ohne die Klammern:
Und Sie können eine Eigenschaft mit Klammern:
Der einzige Weg, um sicherzustellen, gibt es keine Mehrdeutigkeiten ist, dass eine Methode und eine Eigenschaft mit dem gleichen Namen.