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));
}