代码之家  ›  专栏  ›  技术社区  ›  lincolnk

我不应该得到一个编译器警告吗?如何启用它?

  •  1
  • lincolnk  · 技术社区  · 15 年前

    public class MyClass
    {
        public string myMessage { get; set; }
    
        void MyMethod() 
        {
            string myMessage;
        }
    }
    

    我不应该得到一个关于 myMessage MyMethod 我的消息 班级的财产?当我建造时,我不会得到这样的效果。如何激活此支票?

    4 回复  |  直到 15 年前
        1
  •  6
  •   Eric Olsson    15 年前

    MyMethod() ,您可以使用 this.myMessage 消除本地属性和类属性之间的歧义。

        2
  •  8
  •   Eric Lippert    15 年前

    这里的问题是,我们无法区分一个有效的,想要的隐藏案例和一个意外的隐藏案例。我们试着为以下情况保留警告:(1)代码 几乎可以肯定 错误和(2)有一种直接的方法重写代码,这样如果所述的代码实际上是需要的,那么警告就被消除了。

    这通常是理想的情况,因为:

    class Frog
    {
        private string name;
        public Frog(string name)
        {
            this.name = name;
    

    new Frog(name: "Kermit") 在C#4或Visual Basic中。因为隐藏是需要的,而且代码是正确的,所以我们不想为隐藏产生警告。

        3
  •  2
  •   Ryan Ische    15 年前

    Lexical Scoping . MyMethod中的myMessage是在一个新范围中定义的。在该方法中对myMessage的任何引用都将假定您引用的是该范围中定义的变量。您可以使用此.myMessage.

    根据这些信息,您可以从编译器的角度来理解为什么这是完全有效的。它是否应该给你一个警告是有趣的。正如mitchwheat在他的评论中指出的那样,ReSharper这样的工具会警告您这些事情,但是编译器是否应该警告您它处理词法范围的某些事情的冲突是有争议的。似乎更像是一个辅助工具的工作。

        4
  •  0
  •   Dan Bryant    15 年前

    这实际上与私有字段的一种命名模式是一致的,尽管我自己更喜欢\u fieldName:

    public class MyClass
    {
        private string myMessage;
    
        public MyClass(string myMessage)
        {
            this.myMessage = myMessage;
        }
    }