Laden...

Frage zu statischer generischer Methode und Überladung

Letzter Beitrag vor 15 Jahren 7 Posts 1.227 Views
Frage zu statischer generischer Methode und Überladung

Hallo,

ich habe eine Klasse (nicht statisch), welche zwei Methoden besitzt:


public static object Copy(ISerializable original, StreamingContext context) {
	DeepISerializableObjectCopyer dc = new DeepISerializableObjectCopyer(context);
	return dc.MakeCopy(original);
}

public static T Copy<T>(T original, StreamingContext context) where T : ISerializable {
	return (T)Copy(original, context);
        //return (T)Copy((ISerializable)original, context);
}

rufe ich jetzt die generische Methode T Copy<T>(...) auf, bekomme ich eine StackOverflowException, weil im Body immer wieder die generische aufgerufen wird. Kann mir jemand erklären, warum. Die Signatur der nicht generischen Methode unterscheidet sich doch von der der generischen, oder?

Nehme ich den auskommentierten Code rein (und natürlich die andere Zeile raus), funktioniert alles wie erwartet?!

Danke

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

Hallo Friedel,

Kann mir jemand erklären, warum. Die Signatur der nicht generischen Methode unterscheidet sich doch von der der generischen, oder?

Jein: Der Compiler ist in der Lage, Typparameter für generische Methoden zu erraten (sehr wichtig / komfortabel im Zusammenhang mit LINQ).

Eine weitere "Reegel" sagt aus, dass der Compiler immer die am besten geeignete Methode aufruft, d.h. möglichst keine automatischen Casts für Parameter durchführt.

Daher wird deine generische Copy aufgerufen.

Durch den expliziten Cast nach ISerializable machst du deutlich, welche Methode du tatsächlich aufrufen möchtest.
Also: It's not a bug - it's a feature 😉

Jein: Der Compiler ist in der Lage, Typparameter für generische Methoden zu erraten (sehr wichtig / komfortabel im Zusammenhang mit LINQ).

Wenn das also wichtig / komfortabel für LINQ ist, heißt das dann, dass in einer früheren Version (Framework/IDE) der Compiler nicht geraten und damit dann richtig gelegen hätte? 😁

Danke für die Erklärung.

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

Nein, das macht der Compiler so, seit es Generics gibt.

Siehe dazu auch Generische Methoden (C#) (Abschnitt "Typableitungsregeln").

Gruß,
dN!3L

Danke für den MSDN-Link.

Ich wundere mich nur, dass mir das noch nie aufgefallen ist 8o

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

Kleiner Trick:


      public static object Copy(ISerializable original, StreamingContext context)
      {
         return CopyInternal(original, context);
      }

      public static T Copy<T>(T original, StreamingContext context) where T : ISerializable
      {
         return (T)CopyInternal(original, context);
         //return (T)Copy((ISerializable)original, context);
      }

      private static object CopyInternal(ISerializable original, StreamingContext context)
      {
         DeepISerializableObjectCopyer dc = new DeepISerializableObjectCopyer(context);
         return dc.MakeCopy(original);
      }

Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.