[C#]Cast vid list generics och if-else
Sprang över två intressanta saker i .NET 2.0 idag som säkert nån kan ha nytta/vara intresserad av:
1. Cast vid list generics
string s = "A";
object o = s;
Detta är inget konstigt, string är ett objekt.
Men om man har följande:
List<string> strings = new List<string>();
strings.Add("A");
List<object> objects = strings;
så kommer det att resultera i ett kompileringsfel:
Cannot implicitly convert type 'System.Collections.Generic.List<string>' to 'System.Collections.Generic.List<object>'
Ok, så då testar vi:
List<string> strings = new List<string>();
strings.Add("A");
List<object> objects = (List<object>)strings;
Men aningen förvånande så resulterar detta i:
Error 1 Cannot convert type 'System.Collections.Generic.List<string>' to 'System.Collections.Generic.List<object>'
Orsaken är att List<T> inte håller fast vid T's (typens) ärvningsstruktur (inheritance tree).
Detta är lite irriterande i vissa situationer och jag har inte kommit på något bättre sätt än att iterera genom listan och casta varje element skillt:
List<object> objects = new List<object>(strings.Count);
foreach (string s in strings)
{
objects.Add((object)s);
}
Eller lite snyggare:
List<object> objects = strings.ConvertAll<object>(
delegate(string s)
{
return (object)s;
});
2. Cast vid If-else
Vi har ett helt vanligt objekt:
public class Customer
{
private DateTime m_LastOrderDate;
public Customer(){}
public DateTime LastOrderDate
{
get
{
return m_LastOrderDate;
}
internal set
{
m_LastOrderDate = value;
}
}
}
Sedan har vi ett dataobjekt som vill visa ett attribut på en instans av Customer och om vi inte har någon Customer så ska ingenting visas, dvs. vi använder oss av en nullable DateTime:
public DateTime? LastOrderDate
{
get
{
return m_Customer != null ? m_Customer.LastOrderDate : null;
}
}
Detta kommer att resultera i ett kompileringsfel:
Error 1 Type of conditional expression cannot be determined because there is no implicit conversion between 'System.DateTime' and '<null>'
Vilket ju är lite märkligt, eftersom DateTime är en delmängd av nullable DateTime! Följande (exakt samma sak, bara annan notation!) gårdock fint:
public DateTime? LastOrderDate
{
get
{
if (m_Customer != null)
return m_Customer.LastOrderDate;
return null;
}
}
Helt otroligt.
Vad man måste göra är att explicit casta vår DateTime till en nullable DateTime:
public DateTime? LastOrderDate
{
get
{
return m_Customer != null ? (DateTime?)m_Customer.LastOrderDate : null;
}
}
"Mies saa kaatua mutta ei karata." -- Adolf Ehrnrooth IR 7, Äyräpää 1944.