使用 ToLower() 进行切换会导致错误 CS0426 类型名称 '' 在类型 '' 中不存在

Ogg*_*las 1 c#

为什么编译器仅在 switch 语句中为常量值调用方法时才会抱怨,为什么会出现错误The type name 'A' does not exist in the type

CS0426 类型名称“A”在类型“ClassificationIdentifiers.ClassificationIdentifiersChildren”中不存在

public static class ClassificationIdentifiers
{
    public static class ClassificationIdentifiersChildren
    {
        public const string A = "A";
    }
}

switch (classificationFileType)
{
    case ClassificationIdentifiers.ClassificationIdentifiersChildren.A:
        classification = ClassificationIdentifiers.ClassificationIdentifiersChildren.A;
        break;
}

switch (classificationFileType)
{
    case ClassificationIdentifiers.ClassificationIdentifiersChildren.A.ToLower():
        classification = ClassificationIdentifiers.ClassificationIdentifiersChildren.A;
        break;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我认为这与下面的错误有关,"A".ToLower();或者case a.ToLower():

const string a = "A".ToLower();

switch (classificationFileType)
{
    case a.ToLower():
        classification = ClassificationIdentifiers.ClassificationIdentifiersChildren.A;
        break;
}
Run Code Online (Sandbox Code Playgroud)

CS0133 分配给“a”的表达式必须是常量

CS0118 'a' 是一个变量,但像类型一样使用

在此输入图像描述

can*_*on7 5

您的问题可以简化为以下内容:

public class Test
{
    public const string C = "C";  
    public void M(string s)
    {
        switch (s)
        {
            case C.ToLower():
                break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

其产生:

错误 CS0246:找不到类型或命名空间名称“C”(您是否缺少 using 指令或程序集引用?)

标签中的东西case是一个模式,它可以是常量模式,也可以是递归模式。常量模式是诸如1"test"或 const 变量或字段的名称之类的东西。

递归模式ToLower变得复杂,但是这个模式正在名称空间中寻找类型C,该类型具有空的解构函数。就像是:

public class Test
{
    public void M(object s)
    {
        switch (s)
        {
            case C.ToLower():
                break;
        }
    }
}

namespace C
{
    public class ToLower
    {
         public void Deconstruct() { }   
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是为什么它抱怨无法找到类型或名称空间C:它正在寻找ToLower类型。


我认为这有效的事实只是规范的一个怪癖——我看不出它有任何有用的需求。