当我打开一个列表时,我很难让一个开关案例语句工作。
List<int> Test = new List<int>(){9, 6, 5};
switch(Test)
{
case new List<int>(){9, 6, 5}:
Console.Write("Yes");
break;
case new List<int>(){2, 4, 8}:
Console.Write("No");
break;
}我得到的错误“一个开关表达式或大小写标签必须是一个bool,char,字符串,积分,枚举,或相应的可空类型”。
开关语句只是不工作在集合类型,如列表和数组?
发布于 2022-06-22 15:57:08
C#11 (直到编写还在预览中)让您得到了列表模式的介绍,这个示例可能类似于这个示例(我不能完全测试它,所以请稍加修改- @MatthewWatson发布了一个没有案例保护的版本):
List<int> Test = new List<int>(){9, 6, 5};
switch(Test)
{
case var _ when Test is [9, 6, 5]:
Console.Write("Yes");
break;
case var _ when Test is [2, 4, 8]:
Console.Write("No");
break;
}在此之前,您可以像他们一样使用护箱员来执行这里,这看起来可能如下所示:
List<int> Test = new List<int>(){9, 6, 5};
switch(Test)
{
// maybe implement it like some of the answers here https://stackoverflow.com/questions/876508/what-is-the-best-way-to-check-two-listt-lists-for-equality-in-c-sharp
case var _ when Helper.AreEquivalent(Test, new List<int>(){9, 6, 5}):
Console.Write("Yes");
break;
case var _ when Helper.AreEquivalent(Test, new List<int>(){2, 4, 8}):
Console.Write("No");
break;
}发布于 2022-06-22 16:08:28
您可以使用新的C# 11模式匹配来解决这个问题。如果将以下内容添加到项目文件(假设SDK样式的项目)中,现在可以在Visual 2022 (预览形式)中启用它:
<LangVersion>preview</LangVersion>请注意,在发布C# 11之前,预览功能可能会发生变化,因此在此之前您不能依赖于C# 11功能。
然后,您可以编写如下所示的开关语句:
switch (Test)
{
case [9, 6, 5]:
Console.WriteLine("Yes");
break;
case [2, 4, 8]:
Console.WriteLine("No");
break;
}请注意,如果您试图返回一个值,而不是调用一个void返回方法,您可以使用一个开关表达式,这对于某些事情来说更好。
假设您正在返回一个字符串:
Console.WriteLine(Test switch
{
[9, 6, 5] => "Yes",
[2, 4, 8] => "No",
_ => "Other"
});但是,当然,如果使用的是开关表达式,则如果没有找到匹配的情况,则必须为其返回默认值。
发布于 2022-06-22 15:50:02
开关语句只适用于基本数据类型,如int、string、bool等。为此您可以使用if etc条件。
https://stackoverflow.com/questions/72718456
复制相似问题