我try 使用switch语句将整数变量myVar与字典myDict中存储的整数值进行比较.

我收到一个错误

类型为‘int’的表达式不能由类型为‘myDict[]’的模式处理

这是我的代码:

Dictionary<string, int> myDict = new Dictionary<string, int>()
    {
        ["Mary"] = 1,
        ["John"] = 2
    }; 

void MyMethod()
{
    int myVar = 1;

    switch (myVar)
    {
        case myDict["Mary"]:  // Error here
            Console.WriteLine("Okay");
            break;
    }
}

但当我使用if语句时,它工作得很好:

Dictionary<string, int> myDict = new Dictionary<string, int>()
    {
        ["Mary"] = 1,
        ["John"] = 2
    }; 

void MyMethod()
{
    int myVar = 1;

    if (myVar == myDict["Mary"])  // Works just fine
    {
        Console.WriteLine("Okay");
    }
}

我做错什么了吗?

推荐答案

Case语句中的表达式必须是常量.C#词典及其条目不是常量,因此不能在Case语句中工作.例如,这将会奏效:

    // Test is constant
    const int test = 1;
    int myVar = 1;

    switch (myVar)
    {
        case (test):
            Console.WriteLine("Okay");
            break;
    }

这不会:

    // Test is not constant
    int test = 1;
    int myVar = 1;

    switch (myVar)
    {
        case (test):  // Error here
            Console.WriteLine("Okay");
            break;
    }

这是因为Switch语句在编译时被转换为哈希表-这就是为什么在条件允许的情况下,它们被认为是更有效的解决方案.如果需要与字典中的动态值进行比较,最好使用If语句.您可以阅读有关Switch语句here的更多信息.

Csharp相关问答推荐

WPF文本框点击鼠标 Select 内容

我应该将新的httpReportMessage()包装在using声明中吗?

Microsoft.AspNetCore.Mvc. Controller Base.用户:属性或索引器Controller Base.用户无法分配给--它是只读的

使用变量子根名称在C#中重新初始化SON文件

在Dapper中使用IasyncEum重写GetAsyncEum方法

无法解析数据库上下文的服务

在一个模拟上设置一个方法,该模拟具有一个参数,该参数是一个numc函数表达式

内部接口和类的DI解析

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

使用带有WithAppOnly()请求选项的pageIterator

如何使用MoQ模拟Resources GroupCollection?

如何将字符串变量传递给JObject C#-无法加载文件或程序集';System.Text.Json

依赖项注入、工厂方法和处置困境

如何从另一个类的列表中按ID取值

如何从Azure函数使用Graph API(SDK 5.35)中的[FindMeetingTimes]

RCL在毛伊岛应用程序和Blazor服务器应用程序.Net 8.0中使用页面

c#在后台实现类型化数组

如何在绑定到数据库的datagridview中向上或向下移动行

WPF:如何从DatagridHeader的内容模板绑定到词典项

无效的Zip文件-Zip存档