2013-05-15 7 views
23

Verwendung Während einige veraltete Code Entfernen ich auf ein unerwartetes Szenario kam, unten neu erstellt:Deprecation Verhalten der [Veraltet] Attribut

class Program 
{ 
    static void Main(string[] args) 
    { 
     ViableMethod(); 
     Console.WriteLine("");  
     SoftDeprecatedMethod();//Compiler warning 

     //HardDeprecatedMethod();//Can't call that from here, compiler error 

     Console.ReadKey(true); 
    } 

    public static void ViableMethod() 
    { 
     Console.WriteLine("ViableMethod, calls SoftDeprecatedMethod"); 
     SoftDeprecatedMethod();//Compiler warning 
     //HardDeprecatedMethod();//Can't call that from here, compiler error 
    } 

    [Obsolete("soft", false)] 
    public static void SoftDeprecatedMethod() 
    { 
     Console.WriteLine("SoftDeprecatedMethod, calls HardDeprecatedMethod"); 
     HardDeprecatedMethod(); 
    } 

    [Obsolete("hard", true)] 
    public static void HardDeprecatedMethod() 
    { 
     Console.WriteLine("HardDeprecatedMethod"); 
    } 
} 

in der Ausgabe Basierend es scheint, dass mit einer Warnung veralteten Funktionen sind erlaubt Funktionen aufrufen veraltet mit einem Fehler und der Code wird ausgeführt.

Meine Erwartung war, dass ich einen Compilerfehler sehen würde, der beschwert, dass der Anruf HardDeprecatedMethod() von SoftDeprecatedMethod() nicht erlaubt ist. Das beobachtete Verhalten scheint mir seltsam.

Weiß jemand, ob dies das gewünschte Verhalten ist (und wenn ja, warum), oder könnte dies ein Fehler in der Implementierung des [Obsolete] Attributs sein?

+11

Große Frage. Ich vermute, dass es absichtlich ist (da es manchmal den Abschaffungsprozess viel glatter machen kann), aber es ist * nicht * in der Sprachspezifikation enthalten. –

+0

@JonSkeet Als ich die Frage las, war mein erster Gedanke: "Gott, warum hat Jon das nicht beantwortet?" und dann habe ich deinen Kommentar gelesen. Das war irgendwie ... unerwartet :-) – Krumelur

+1

Nur ein weiterer Hinweis, '[Obsolet]' ist ein [Attribut] (http://msdn.microsoft.com/en-us/library/system.attribute.aspx), kein Schlüsselwort Sie können gerne eine Variable/Klasse 'Obsolete' benennen, wenn Sie dies wünschen. –

Antwort

5

In der Tat ist es umgekehrt: Es zeigt, dass C# -Compiler ist klug und sehr klar auf die Verwendung von Methoden mit Obsolete markiert.

Angenommen, Sie stellen diesen Code als öffentliche API in einer Klassenbibliothek für Bob bereit.

  1. Sie erwarten, wenn Bob HardDeprecatedMethod in seinem Code ruft er eine Kompilierung Fehler erhalten sollten; und er wird es tun.

  2. Sie erwarten, wenn Bob irgendwo aufgerufen hat, von dieser Zeit an sollte er davor gewarnt werden, aber sein Code sollte immer noch funktionieren; und es wird.

So erhalten Sie, was genau Sie wollen!

+0

Und es war eine gute Frage! :) –

Verwandte Themen