为什么编译器仅在 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' 是一个变量,但像类型一样使用
您的问题可以简化为以下内容:
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类型。
我认为这有效的事实只是规范的一个怪癖——我看不出它有任何有用的需求。