我的代码如下:
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");
}
}
但这不起作用。 case语句给出了一个错误,说明了一个常量变量。请帮助伙计们谢谢你们!
答案 0 :(得分:29)
请参阅 C# switch statement limitations - why?
基本上,开关不能在case语句中包含evaluate语句。必须对它们进行静态评估。
答案 1 :(得分:25)
您只能匹配switch语句中的常量。
示例:
switch (variable1)
{
case 1: // A hard-coded value
// Code
break;
default:
// Code
break;
}
成功!
switch (variable1)
{
case variable2:
// Code
break;
default:
// Code
break;
}
CS0150预计会有一个常数值。
答案 2 :(得分:7)
您不能对此使用switch语句,因为案例值无法计算表达式。为此,你必须使用if / else ...
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");
}
}
我也冒昧地整理你的条件陈述。调用ToString()
后无需强制转换为字符串。无论如何,这总是会返回一个字符串。在比较字符串是否相等时,请记住使用==运算符将导致区分大小写的比较。最好使用string compare = 0和最后一个参数来设置区分大小写的开/关。
答案 3 :(得分:3)
Johnnie,请浏览switch上的msdn指南。此外,C#语言规范明确定义了编译时错误情况:
•如果switch表达式的类型是sbyte,byte,short,ushort, int,uint,long,ulong,bool,char,string或enum-type,或者如果它 是可以为这些类型之一的可空类型,那就是 switch语句的控制类型。
•否则,只需要一个用户定义的隐式转换(第6.4节) 从switch表达式的类型到以下之一 可能的管理类型:sbyte,byte,short,ushort,int,uint,long, ulong,char,string或者,对应于其中一个的可空类型 那些类型。
•否则,如果不存在此类隐式转换,或者如果不存在 存在一个这样的隐式转换,发生编译时错误。
希望这有帮助。
答案 4 :(得分:2)
开关非常挑剔。并且被比较的值必须是基元(或现在的字符串)。为此,您应该使用if语句。
原因可能会回到C处理它们的方式,因为它创建了一个跳转表(因为这些值是编译时常量)并且它试图通过不允许在你的情况下使用评估值来复制相同的语义。 p>
答案 5 :(得分:2)
至少在尝试使用Visual Studio 2017时,这似乎对我有用。
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;
}
答案 6 :(得分:0)
现在您可以使用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)
与字符串文字"CustomerDetails"
基本相同,但是在编译时检查它是否引用了某个符号(防止输入错误)。
nameof
出现在C#6.0中,因此在问了这个问题之后。