8 Stimmen

Der Operator "==" verhält sich nicht wie die vom Compiler erzeugte Überschreibung von Equals() für anonyme Typen

Nach Angaben der MSDN :

Da die Funktionen Equals und GetHashCode Methoden für anonyme Typen definiert sind in Form von Equals und GetHashcode der Eigenschaften definiert sind, sind zwei Instanzen von des gleichen anonymen Typs nur dann gleich wenn alle ihre Eigenschaften gleich sind.

Der folgende Code demonstriert jedoch die vom Compiler generierte Implementierung für Equals() verhält sich nicht wie erwartet..:

 DateTime start = new DateTime(2009,1,1);
 DateTime end = new DateTime(2010, 12,31);

 // months since year 0
 int startMonth = start.Date.Year * 12 + start.Date.Month - 1;
 int endMonth = end.Date.Year * 12 + end.Date.Month -1 ;

 // iterate through month-year pairs
 for (int i = startMonth; i <= endMonth ; i++)
 {
  var yearMonth = new { Year = (int)Math.Truncate(i/12d), Month = (i % 12) + 1};

  if (yearMonth.Year == 2009 &&  yearMonth.Month == 2)
   Console.WriteLine("BOOM");

  if (yearMonth == new{Year = 2009, Month = 2})
   Console.WriteLine("I'm never called!");

  Console.WriteLine(yearMonth);
 }

Übersehe ich etwas? Ich schaue mir die generierte MSIL an, aber ich sehe keinen offensichtlichen Fehler. Gibt es eine Möglichkeit zur Fehlersuche auf MSIL-Ebene (neben WinDbg vielleicht)? Übersehe ich etwas?

Ich habe .NET 3.5 (VS 2008 SP1 Compiler) getestet. Als Referenz, hier ist die generierte Equals-Methode:

public override bool Equals(object value)
{
    var type = value as <>f__AnonymousType3<<Year>j__TPar, <Month>j__TPar>;
    return (((type != null) && EqualityComparer<<Year>j__TPar>.Default.Equals(this.<Year>i__Field, type.<Year>i__Field)) && EqualityComparer<<Month>j__TPar>.Default.Equals(this.<Month>i__Field, type.<Month>i__Field));
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X