Ich habe festgestellt, dass einige .NET-Strukturen mit null verglichen werden können. Zum Beispiel:Warum können TimeSpan und Guid Structs mit null verglichen werden?
TimeSpan y = new TimeSpan();
if (y == null)
return;
wird gut kompilieren (das gleiche mit der Guid-Struktur).
Jetzt weiß ich, dass Stucts Werttyp sind und dass der obige Code nicht kompilieren sollte, es sei denn, es gibt eine Überladung von operator ==, die ein Objekt nimmt. Soweit ich das beurteilen konnte, gibt es das nicht.
Ich habe die Klasse mit Reflector und auch in der Dokumentation auf MSDN angesehen.
Die beiden die folgenden Schnittstellen implementieren:
IComparable, IComparable<T>, IEquatable<T>
aber versuchen, die gleichen Schnittstellen implment schien nicht zu helfen:
struct XX : IComparable, IComparable<XX>, IEquatable<XX> {
public int CompareTo(Object obj) {
return 0;
}
public int CompareTo (XX other){
return 0;
}
public bool Equals (XX other){
return false;
}
public override bool Equals(object value){
return false;
}
public static int Compare(XX t1, XX t2){
return 0;
}
}
Ich verwende: 2.0 Visual Studio .NET 2005.
Hat jemand eine Idee, was ist der Grund dafür? Ich versuche nur, ein besseres Verständnis zu bekommen. Dies ist kein Problem, da ich weiß, dass ich structs nicht mit null vergleichen sollte.
"Ich verwende: .NET 2.0 Visual Studio 2005." - Ist das eine Warnung? IIRC, sollte es im Jahr 2005 tun (aber nicht 2008, siehe unten) –
Keine Warnung Für den Zeitraum gibt es einen Fehler für XX: Fehler CS0019: Operator ‚==‘ kann nicht auf Operanden vom Typ angewandt werden ‚TransControl.TraceDisplay.XX‘ und '' –
dtroy
mögliches Duplikat von [Wie kann ein Objekt nicht mit null verglichen werden?] (http://stackoverflow.com/questions/648115/how-can-an-object-not-be-compared-to-null) – nawfal