Überladen von Methoden mit Wert- und Referenzparametertypen

8

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?

    
Brahim Boulkriat 01.11.2013, 15:29
quelle

4 Antworten

10

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.

    
Habib 01.11.2013, 15:32
quelle
7

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 und ref 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 mit out Modifikatoren in ref Modifikatoren geändert würden. Für andere Zwecke der Signaturübereinstimmung (z. B. Verbergen oder Überschreiben) werden ref und out 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 in ref und out 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:

%Vor%

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.

    
Jon Skeet 01.11.2013 15:34
quelle
1

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:

    
sll 01.11.2013 15:32
quelle
-1

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.

    
Sudhakar Tillapudi 01.11.2013 15:34
quelle

Tags und Links