好的,所以 C# 语言规范有一个关于成员及其类型具有相同名称的规则的特殊部分(旧版本链接) 。Color Color
著名的大师 Eric Lippert曾经在博客上写过它。
我在这里要问的问题在某种意义上(不)与在线程Circular definition in a constant enum中提出的问题完全相同。如果你愿意,你可以去投票赞成其他问题。
现在我的问题。考虑这段代码:
namespace N
{
public enum Color
{
Green,
Brown,
Purple,
}
public class C1
{
public const Color Color = Color.Brown; // error CS0110 - WHY? Compiler confused by Color Color?
}
public class C2
{
public static readonly Color Color = Color.Brown; // fine
}
public class C3
{
public static Color Color = Color.Brown; // fine
}
public class C4
{
public Color Color = Color.Brown; // fine
}
}
这里的要点是,在上述每种情况下,最右边的标识符Color
可以指代enum
类型,也可以指代具有相同名称的类成员。但是Color Color
上面提到的规则意味着我们应该看看成员(Brown
)是静态的还是非静态的。由于在这种情况下它是静态的,我们应该Color
相应地解释。
我明显的主要问题:为什么这不适用于const
类型成员?这是无意的吗?
(显然,说N.Color.Brown
(N
是名称空间)“修复”它;我不是在问这个!)
旁注:使用局部变量const
,上述异常不存在:
public class C5
{
public Color Color;
void M()
{
const Color Color = Color.Brown; // works (no warning for not using local variable?)
}
}
public class C6
{
public Color Color;
void M()
{
const Color other = Color.Brown; // works (warning CS0219, 'other' not used)
}
}