【发布时间】:2015-02-27 21:57:20
【问题描述】:
好的,所以 C# 语言规范在 Color Color 规则上有 a special section (old version linked),其中成员及其类型具有相同的名称。知名大师 Eric Lippert once blogged 关于它。
我在这里要问的问题在某种意义上(不)与线程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)
}
}
【问题讨论】:
-
伪枚举也有同样的问题:
class Pseudo { public const Pseudo Brown = null; } class C7 { public const Pseudo Pseudo = Pseudo.Brown; /* error CS0110 */ } -
常量表达式很重要。从技术上讲,编译器可以通过在解析整个语句之前不将标识符添加到符号表来解决这个问题。但这会影响
const int bad = bad + 1;的诊断质量现在你会得到“名称不存在”,这并不漂亮。 -
谷歌搜索了一下,在 JetBrains 上看到一个关于智能感知评论 youtrack.jetbrains.com/issue/RSRP-353104 的错误,在那里看到评论会很有趣
-
您使用的是哪个编译器版本?我想知道这与 Roslyn (VS2015) 与早期版本是否有任何不同。
-
我猜在以前的版本中是一样的。我发现了这个:connect.microsoft.com/VisualStudio/feedback/details/621384/…,它似乎在 2010 年被报道过,微软对此的回答是“不会修复”。
标签: c# language-lawyer member-access