【问题标题】:Switch with ToLower() causes error CS0426 The type name '' does not exist in the type ''使用 ToLower() 切换会导致错误 CS0426 类型名称 '' 在类型 '' 中不存在
【发布时间】:2020-06-09 09:43:07
【问题描述】:

为什么编译器只会在 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;
}

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

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

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

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

CS0118 'a' 是一个变量,但用作类型

【问题讨论】:

  • 那里有很多位代码。你想解释哪一点?举个例子const string a = "A".ToLower(); - 好吧,上面的错误很清楚。
  • 我怀疑stackoverflow.com/questions/7593377/…你对什么感兴趣?或者考虑使用if 而不是switch。或者考虑使用不区分大小写的Dictionary 来允许从一个值映射到另一个值。
  • String case 必须是常量字符串,所以添加.ToLower() 是编译器错误。它抱怨“类型名称'A'不存在于类型'ClassificationIdentifiers.ClassificationIdentifiersChildren'中”的事实,而不是抱怨“预期的常量值”看起来像一个小的编译器错误
  • 我怀疑 CS0426 实际上是 CS0118 的变体。因为你想要的东西是一个常数,所以它知道最后一个 . 之前的所有内容都需要是一个类型才能实现。如果您不知道它需要一个常量,这似乎让您感到困惑,但从编译器的角度来看可能是有道理的。

标签: c#


【解决方案1】:

您的问题可以简化为:

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

产生:

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

case 标签中的东西是pattern,它可以是常量模式,也可以是递归模式。常量模式是 1"test" 或常量变量或字段的名称。

Recursive patterns 变得复杂,但是这个在命名空间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 类型。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2022-01-10
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    相关资源
    最近更新 更多