Mein Code lautet wie folgt:
public static void Output<T>(IEnumerable<T> dataSource) where T : class
{
dataSourceName = (typeof(T).Name);
switch (dataSourceName)
{
case (string)typeof(CustomerDetails).Name.ToString(); :
var t = 123;
break;
default:
Console.WriteLine("Test");
}
}
Das funktioniert aber nicht. Die case-Anweisung gibt mir einen Fehler, der besagt, dass eine konstante Variable erwartet wird. Bitte helfen Sie Jungs, danke!
c#
switch-statement
Johnnie
quelle
quelle
Antworten:
Siehe Einschränkungen der C # -Schalteranweisung - warum?
Grundsätzlich können Switches keine Anweisungen in der case-Anweisung ausgewertet haben. Sie müssen statisch ausgewertet werden.
quelle
Sie können nur mit Konstanten in switch-Anweisungen übereinstimmen.
Beispiel:
switch (variable1) { case 1: // A hard-coded value // Code break; default: // Code break; }
Erfolgreich!
switch (variable1) { case variable2: // Code break; default: // Code break; }
CS0150 Ein konstanter Wert wird erwartet.
quelle
Sie können hierfür keine switch-Anweisung verwenden, da die Fallwerte keine ausgewerteten Ausdrücke sind. Dafür müssen Sie ein if / else verwenden ...
public static void Output<T>(IEnumerable<T> dataSource) where T : class { dataSourceName = (typeof(T).Name); if(string.Compare(dataSourceName, typeof(CustomerDetails).Name.ToString(), true)==0) { var t = 123; } else if (/*case 2 conditional*/) { //blah } else { //default case Console.WriteLine("Test"); } }
Ich habe mir auch erlaubt, Ihre bedingte Aussage aufzuräumen. Nach dem Aufruf muss keine Zeichenfolge umgewandelt werden
ToString()
. Dies gibt sowieso immer einen String zurück. Beachten Sie beim Vergleichen von Zeichenfolgen auf Gleichheit, dass die Verwendung des Operators == zu einem Vergleich führt, bei dem zwischen Groß- und Kleinschreibung unterschieden wird. Verwenden Sie besser string compare = 0 mit dem letzten Argument, um die Groß- und Kleinschreibung ein- und auszuschalten.quelle
Jetzt können Sie verwenden
nameof
:public static void Output<T>(IEnumerable<T> dataSource) where T : class { string dataSourceName = typeof(T).Name; switch (dataSourceName) { case nameof(CustomerDetails): var t = 123; break; default: Console.WriteLine("Test"); } }
nameof(CustomerDetails)
ist im Grunde identisch mit dem String-Literal"CustomerDetails"
, jedoch mit einer Überprüfung zur Kompilierungszeit, dass es sich auf ein Symbol bezieht (um einen Tippfehler zu verhindern).nameof
erschien in C # 6.0, also nachdem diese Frage gestellt wurde.quelle
Dies scheint für mich zumindest zu funktionieren, als ich Visual Studio 2017 anprobierte.
public static class Words { public const string temp = "What"; public const string temp2 = "the"; } var i = "the"; switch (i) { case Words.temp: break; case Words.temp2: break; }
quelle
switch ist sehr wählerisch in dem Sinne, dass die Werte im switch eine Kompilierungszeitkonstante sein müssen. und auch der Wert, der verglichen wird, muss ein Grundelement (oder jetzt eine Zeichenfolge) sein. Verwenden Sie dazu eine if-Anweisung.
Der Grund kann auf die Art und Weise zurückgehen, wie C sie behandelt, indem es eine Sprungtabelle erstellt (da die Werte Kompilierungszeitkonstanten sind) und versucht, dieselbe Semantik zu kopieren, indem in Ihren Fällen keine ausgewerteten Werte zugelassen werden.
quelle
Johnnie, bitte gehen Sie die MSDN-Anleitung zum Schalter durch . Außerdem definiert die C # -Sprachenspezifikation den Fehlerfall bei der Kompilierung klar:
Hoffe das hilft.
quelle