Gegeben den folgenden Code:
string someString = null;
switch (someString)
{
case string s:
Console.WriteLine("string s");
break;
case var o:
Console.WriteLine("var o");
break;
default:
Console.WriteLine("default");
break;
}
Warum stimmt die switch-Anweisung überein case var o
?
Es ist mein Verständnis, case string s
das nicht übereinstimmt, wenn, s == null
weil (effektiv) (null as string) != null
als falsch bewertet. IntelliSense auf VS Code sagt mir, dass dies auch ein o
ist string
. Irgendwelche Gedanken?
Ähnlich wie: C # 7-Schalterfall mit Nullprüfungen
var
in diesem Zusammenhang überhaupt zuzulassen . Das scheint sicher die Art von Dingen zu sein, die ich in C ++ finden würde, nicht in einer Sprache, die den Programmierer "in die Grube des Erfolgs" führen soll. Hier var
ist sowohl mehrdeutig als auch nutzlos, Dinge, die C # -Design normalerweise zu vermeiden scheint.
switch
könnte unaussprechlich sein - anonyme Typen usw.; und es ist nicht mehrdeutig - der Compiler kennt den Typ genau; Es ist nur verwirrend (zumindest für mich), dass die null
Regeln so unterschiedlich sind!
o
siestring
(mit Generika bestätigt - dhFoo(o)
woFoo<T>(T template) => typeof(T).Name
) - es ist ein sehr interessanter Fall,string x
verhält sich anders alsvar x
selbst wennx
eingegeben wird (durch den Compiler) alsstring