2010-05-27 8 views
6

Ich habe eine Klasse (Klasse B), die eine andere Klasse (Klasse A) erbt, die virtuelle Methoden enthält.Warum wird dieser C# -Code ordnungsgemäß kompiliert, wenn eine mehrdeutige virtuelle Methode vorhanden ist?

Irrtümlicherweise I weggelassen, um das override Schlüsselwort, wenn eine (vermeintlich wird) zwingende Methode in der Klasse B. erklärt

Klasse A

public class ClassA{ 
    public virtual void TestMethod(){ 
    } 
} 

Klasse B

public class ClassB : ClassA{ 
    public void TestMethod(){ 
    } 
} 

Der Code kompiliert ohne ein Problem. Kann mir jemand erklären warum?

+1

Haben Sie Warnungen aktiviert? – zildjohn01

+0

Warnungen wurden abgestellt - wieder zurück jetzt :) – Jimbo

Antwort

7

Es ist nicht zweideutig. Es sollte mit einer Warnung kompiliert werden, um zu sagen, dass Sie entweder "neu" oder "überschreiben" angeben sollten und dass der Standardwert effektiv "neu" ist.

Es gibt definitiv eine Warnung, wenn ich versuche, diesen Code zu kompilieren - wenn Sie sagen, kompiliert "fein" und "ohne ein Problem" ignorieren Sie Warnungen?

+0

In der Tat habe ich Warnungen nicht angezeigt - danke dafür, wird Warnungen wieder aufstellen. – Jimbo

+0

Welchen Anwendungsbereich wird die 'neue' Methode in diesem Fall haben? Wenn "override" im Wesentlichen die alte Methode abbricht, muss 'new' eine Zugriffsebene für diese Methode erstellen? – Jimbo

+0

@Jimbo: Ich bin mir nicht sicher, welche Terminologie Sie wirklich hier verwenden - "Abbrüche" und "Zugriffsebene" sind hier nicht wirklich anwendbar. Aber im Grunde, wenn Sie 'TestMethod' auf einem Verweis mit einem Kompilierungszeittyp von' ClassA' aufrufen, wird es die ursprüngliche Methode aufrufen, und wenn Sie einen Verweis mit einem Kompilierungszeittyp von 'ClassB' verwenden, wird die abgeleitete Klasse verwendet Methode. –

0

Klasse B sollte

public class ClassB : ClassA{ 
    public override void TestMethod(){ 
    } 
} 

sein, aber es kann ohne die Überschreibung kompilieren - es sollte eine Warnung erzeugen, dass, wenn es beabsichtigt war Sie das neue Schlüsselwort

public class ClassB : ClassA{ 
    public new void TestMethod(){ 
    } 
} 

Kasse this hinzufügen müssen für Weitere Informationen

+1

-1: Nicht was er fragte –

+0

sorry - ich werde die Antwort in einer Minute bearbeiten –

1

Der C# -Compiler generiert eine Warnung. Ich rate Ihnen, immer mit "Warnungen als Fehler" zu kompilieren.

Verwandte Themen