Code: Select all
public class Number
{
[System.Obsolete()] public string ToExactString() => "";
[System.Obsolete()] public override string ToString() => "";
}
< /code>
Betrachten Sie jetzt diesen Code: < /p>
Number number = new();
string s1 = number.ToExactString();
string s2 = number.ToString();
< /code>
und nun beobachten Studio mit einem Through, und der Compiler erzeugt Warnung CS0612: "'Mitglied' ist veraltet".
[*] Der Aufruf von toString ()
als Ergebnis:
Es spielt keine Rolle, ob meine altern Während des Builds und ich kann sogar "alle Warnungen als Fehler behandeln" für ein gutes Maß aktiv Beachten Sie, dass der Aufruf dieses toString () nie wissen werde.
Beachten Der Unterschied zwischen den beiden Methoden besteht darin , weil ich einen Verweis auf Nummer habe, nicht auf Objekt . Projekte, die ich CS0809 habe: "Veraltetes Mitglied überschreibt das Nicht-Obsolete-Mitglied" Deaktiviert , da diese Warnung völlig sinnlos ist, da sie in einigen Fällen vollkommen gut und sogar sehr wünschenswert ist Haben Sie ein veraltetes Mitglied, das ein nicht-obsoletes Mitglied überschreibt, da der Fall mit toString () hier ist. Der Punkt hier ist, dass ich möchte , um eine veraltete Überschreibung zu erstellen, die niemand direkt aufrufen sollte, obwohl er zu Recht durch Code aufgerufen werden kann, der einen Verweis auf die Basisklasse hält. < /p>
Visual Studio rendert alle Bevölkerung mit einem Through, der zeigt, dass Visual Studio genau versteht, welche Methode jeweils aufgerufen wird, während Roslyn vorgibt, nicht zu verstehen, welche Methode ist im Fall von toString () aufgerufen, als ob es sich um eine Überschreibung handelt. .Obsolete ("meldung")] Dann ist die Warnung zum Aufruf von toexactString () Änderungen an CS0618: 'Mitglied' veraltet: 'Nachricht', aber absolut nichts anderes ändert sich.
Die Fragen: < /p>
- Ist dies ein Fehler im C# Compiler? < /li>
Gibt es es ein bekanntes Fix oder Problemumgehung?