Ich habe den folgenden Code:
%Vor% Dieser Code funktioniert gut, obwohl die Methodensignatur nur durch das out
Schlüsselwort unterschieden wird.
Aber der folgende Code hat nicht funktioniert:
%Vor%Warum hat dieser Code nicht funktioniert? Sind Schlüsselwörter wie ref und out Teil von Methodensignaturen?
out-Parametermodifikator (C # -Referenz)
Obwohl die Schlüsselwörter ref und out zu unterschiedlichem Laufzeitverhalten führen, Sie werden bei der Kompilierung nicht als Teil der Methodensignatur betrachtet. Daher können Methoden nicht überladen werden, wenn der einzige Unterschied besteht ist, dass eine Methode ein ref Argument und die andere ein out braucht Argument.
Siehe auch: ref (C # -Referenz )
Mitglieder einer Klasse können keine Signaturen haben, die sich nur durch ref und unterscheiden out. Ein Compilerfehler tritt auf, wenn der einzige Unterschied zwischen zwei besteht Mitglieder eines Typs ist, dass einer von ihnen einen ref-Parameter und die Andere hat einen out-Parameter.
Um etwas anders zu zitieren als die anderen Antworten, ist dies aus Abschnitt 3.6 der C # 5-Spezifikation, die ich eher klarer und präziser finde als das "Referenzhandbuch":
Obwohl die Modifizierer
out
undref
als Teil einer Signatur betrachtet werden, können Mitglieder, die in einem einzigen Typ deklariert sind, sich in der Signatur nicht nur durch ref und out unterscheiden. Ein Kompilierungsfehler tritt auf, wenn zwei Member im selben Typ mit Signaturen deklariert werden, die identisch wären, wenn alle Parameter in beiden Methoden mitout
Modifikatoren inref
Modifikatoren geändert würden. Für andere Zwecke der Signaturübereinstimmung (z. B. Verbergen oder Überschreiben) werdenref
undout
als Teil der Signatur betrachtet und stimmen nicht überein. (Diese Einschränkung ermöglicht die einfache Übersetzung von C # -Programmen auf die Common Language Infrastructure (CLI), die keine Möglichkeit bietet, Methoden zu definieren, die sich nur inref
undout
unterscheiden.)
Beachten Sie, dass ein Parametertyp von dynamic
hier etwas ähnlich ist. Soweit es die CLR betrifft, ist das nur ein Parameter vom Typ object
, daher ist dies ungültig:
In diesem Fall ist es jedoch in Ordnung, wenn eine Methode mit einem Parametertyp dynamic
eine mit einem Parametertyp object
überschreibt oder umgekehrt - der wichtige Punkt dort ist, dass sie Anrufer , während dies bei out
/ ref
nicht der Fall ist.
Dies ist nach Spezifikation. Laut MSDN-Seite out Parametermodifikator (C # -Referenz)
Obwohl die Schlüsselwörter ref und out zu unterschiedlichem Laufzeitverhalten führen, Sie werden nicht zur Kompilierungszeit als Teil der Methodensignatur betrachtet. Daher können Methoden nicht überlastet werden, wenn der einzige Unterschied darin besteht Eine Methode benötigt ein ref-Argument und die andere ein out-Argument. Der folgende Code wird beispielsweise nicht kompiliert:
Es ist im Grunde ein Kompilierungsfehler, da sowohl ref als auch out fast identisch sind. Beide sind fast gleich, aber ein Wert, den Sie einem Parameter out übergeben, muss nicht initialisiert werden.
Tags und Links c# method-overloading