gpt4 book ai didi

c# - C# 编译器是否将 Color Color 规则错误地用于 const 类型成员?

转载 作者:IT王子 更新时间:2023-10-29 04:01:24 26 4
gpt4 key购买 nike

好的,所以 C# 语言规范有 a special section (old version linked)Color Color 规则中,其中成员及其类型具有相同的名称。知名大师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)
}
}

最佳答案

这是一个错误。我无法在 VS 2015 的 CTP 5 中重现这个问题,我认为这个应该作为 Roslyn 重写的一部分得到修复。然而,下面的评论者指出他们可以在 CTP 6 中重现它。所以我不确定这里发生了什么,至于这个错误是否已被修复。

个人注意事项:我不记得在 2010 年首次报道时我是否负责调查这个问题,但由于当时我在圆度检测器方面做了很多工作,所以可能性很大.

这远不是圆度检测器中存在的唯一错误;如果存在嵌套的泛型类型,而嵌套的泛型类型又具有其类型参数涉及嵌套类型的泛型基类型,它会变得非常困惑。

对于亚历克斯“不会修复”这个问题,我一点也不感到惊讶;我花了相当长的时间重写了类循环检测的代码,但这种改变被认为风险太大。所有这些工作都交给了 Roslyn。

如果您有兴趣了解 Color Color 绑定(bind)代码在 Roslyn 中的工作方式,请查看恰当命名的方法 BindLeftOfPotentialColorColorMemberAccess -- 我喜欢一些描述性的方法名称 -- 在 Binder_Expressions.cs 中。

关于c# - C# 编译器是否将 Color Color 规则错误地用于 const 类型成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28775034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com