C# 带ToLower()的开关导致错误CS0426类型“”中不存在类型名称“”

C# 带ToLower()的开关导致错误CS0426类型“”中不存在类型名称“”,c#,C#,为什么编译器只在switch语句中为常量值调用方法时才会抱怨,为什么类型名“a”在类型中不存在是错误 CS0426类型中不存在类型名称“A” 'ClassificationIdentifiers.ClassificationIdentifierChildren' 我认为这与下面的错误有关,A.ToLower;或案例a.ToLower: CS0133分配给“a”的表达式必须是常量 CS0118“a”是一个变量,但与类型一样使用 您的问题可以简化为以下内容: public class Test {

为什么编译器只在switch语句中为常量值调用方法时才会抱怨,为什么类型名“a”在类型中不存在是错误

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

我认为这与下面的错误有关,A.ToLower;或案例a.ToLower:

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

CS0118“a”是一个变量,但与类型一样使用


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

public class Test
{
    public const string C = "C";  
    public void M(string s)
    {
        switch (s)
        {
            case C.ToLower():
                break;
        }
    }
}
产生:

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

case标签中的内容是一个,可以是常量模式,也可以是递归模式。常量模式类似于1、test或常量变量或字段的名称

变得复杂,但这是在命名空间C中寻找一个ToLower类型,它有一个空解构器。比如:

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

namespace C
{
    public class ToLower
    {
         public void Deconstruct() { }   
    }
}
这就是为什么它抱怨找不到类型或名称空间C:它在找一个ToLower类型


我认为这只是规范中的一个怪癖——我看不出有什么有用的需要。

您的问题可以简化为以下几点:

public class Test
{
    public const string C = "C";  
    public void M(string s)
    {
        switch (s)
        {
            case C.ToLower():
                break;
        }
    }
}
产生:

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

case标签中的内容是一个,可以是常量模式,也可以是递归模式。常量模式类似于1、test或常量变量或字段的名称

变得复杂,但这是在命名空间C中寻找一个ToLower类型,它有一个空解构器。比如:

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

namespace C
{
    public class ToLower
    {
         public void Deconstruct() { }   
    }
}
这就是为什么它抱怨找不到类型或名称空间C:它在找一个ToLower类型


我认为这只是规范中的一个怪癖,我看不出有什么有用的需要。

这里有许多代码位。你想解释哪一点?例如,常量字符串a=a.ToLower;-嗯,上面的错误很明显。我怀疑你对什么感兴趣?或者考虑使用IF,而不是开关。或者考虑使用一个不区分大小写的字典来允许从一个值映射到另一个值。字符串情况必须是常数字符串,因此ToLower是一个编译器错误。它抱怨类型“ClassificationIdentifiers.ClassificationIdentifiersChildren”中不存在类型名“A”,而不是抱怨需要一个常量值,这看起来像是一个小编译器错误。我怀疑CS0426实际上是CS0118的一个变体。因为你想要的东西是一个常数,它知道在最后一个之前的一切。需要一种类型才能实现这一点。如果你不知道它需要一个常数,这对你来说似乎很困惑,但从编译器的角度来看,这可能是有意义的。你想解释哪一点?例如,常量字符串a=a.ToLower;-嗯,上面的错误很明显。我怀疑你对什么感兴趣?或者考虑使用IF,而不是开关。或者考虑使用一个不区分大小写的字典来允许从一个值映射到另一个值。字符串情况必须是常数字符串,因此ToLower是一个编译器错误。它抱怨类型“ClassificationIdentifiers.ClassificationIdentifiersChildren”中不存在类型名“A”,而不是抱怨需要一个常量值,这看起来像是一个小编译器错误。我怀疑CS0426实际上是CS0118的一个变体。因为你想要的东西是一个常数,它知道在最后一个之前的一切。需要一种类型才能实现这一点。如果你不知道它需要一个常量,那么你可能会感到困惑,但从编译器的角度来看,它可能是有意义的