c#中的切换情况-期望常量值
本文关键字:期望 常量 情况 | 更新日期: 2023-09-27 18:10:04
我的代码如下:
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语句给了我一个错误,说期望有一个常数变量。请帮忙,谢谢!
有一个技巧是与我分享的(不要问细节-将无法提供它们,但它适用于我):
switch (variable_1)
{
case var value when value == variable_2: // that's the trick
DoSomething();
break;
default:
DoSomethingElse();
break;
}
见c# switch语句限制-为什么?
基本上,switch不能在case语句中使用求值语句。它们必须静态地求值。
只能匹配switch语句中的常量
的例子:
switch (variable1)
{
case 1: // A hard-coded value
// Code
break;
default:
// Code
break;
}
成功!
switch (variable1)
{
case variable2:
// Code
break;
default:
// Code
break;
}
CS0150期望一个常量
现在您可以使用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中,所以在问了这个问题之后
不能使用switch语句,因为case值不能被求值表达式。为此,您必须使用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。这将总是返回一个字符串。在比较字符串是否相等时,请记住使用==操作符将导致区分大小写的比较。最好对最后一个参数使用string compare = 0来设置区分大小写的开/关。
这似乎至少在我尝试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;
}
switch非常挑剔,因为switch中的值必须是编译时常数。而且被比较的值必须是一个原语(或者字符串)为此,您应该使用if语句。
原因可能要追溯到C处理它们的方式,因为它创建了一个跳转表(因为值是编译时常量),并且它试图通过不允许在您的情况下评估值来复制相同的语义。
Johnnie,请查看msdn交换机指南。此外,c#语言规范清楚地定义了编译时错误的情况:
•如果switch表达式的类型为sbyte, byte, short, ushort,Int, uint, long, ulong, bool, char, string,或enum类型,或if可空类型是否对应于这些类型之一switch语句的控制类型。
•否则,必须只有一个用户定义的隐式转换(§6.4)从switch表达式的类型存在到以下类型之一可能的控制类型:sbyte, byte, short, ushort, int, uint, long,Ulong、char、string或对应于其中一种的可空类型这些类型。
•否则,如果不存在这样的隐式转换,或者大于如果存在这样的隐式转换,则会发生编译时错误。
这确实需要最新或接近最新版本的c#。这样做的好处是,本例中的变量"value"可以像这样操作,
switch (args[1])
{
case var value when string.Equals(value, "SELECT_ALL", StringComparison.OrdinalIgnoreCase):
{
....
break;
}
case var value when string.Equals(value, "UNSELECT_ALL", StringComparison.OrdinalIgnoreCase):
{
...
...
break;
}
等。等。
确保你永远不会匹配到错误的文字,在这种情况下,因为你忘记使用ToUpper()或其他…