【问题标题】:Access a variable named as its type c#访问一个名为 c# 类型的变量
【发布时间】:2013-06-06 14:57:48
【问题描述】:

在以下示例代码中:

public class Foo
{
    public struct Data
    {
        public int val;
    }

    public Data Data

    void method(Foo foo)
    {
        foo.Data.val = 10;
    }
}

前面的例子导致如下错误:

错误 3 'Foo.Data' 和 'Foo.Data' 之间的歧义

知道如何在不重命名成员变量的情况下修复此错误吗?由于我通过对象实例访问“数据”,因此编译器选择“数据”成员变量而不是“数据”类型对我来说听起来合乎逻辑。

【问题讨论】:

  • 这不是您唯一的问题。 The type 'UserQuery.Foo' already contains a definition for 'Data'
  • 您发布的程序没有产生您描述的错误。
  • @EricLippert:当我测试它时,它确实如此,尽管我需要在字段声明之后添加终止 ;
  • 错误真的是"The type 'Demo.Foo' already contains a definition for 'Data'"
  • @EricLippert:进一步考虑,是的,它可以。 class X { class Y { public static int z; } int z; X Y; } 那么Y.z 可以是Y 中的静态字段,也可以是X 字段的实例字段。

标签: c# variables naming ambiguity


【解决方案1】:

出现这种情况,以及第二个更明显的错误,因为它们都有相同的完全限定名称——它们都是Foo 的成员。

如果将结构体移到类外,它会正常工作。

【讨论】:

    【解决方案2】:

    除了将嵌套结构移到外部(或重命名您明确排除的属性)之外,您根本无法做到这一点:

    public struct Data
    {
        public int val;
    }
    
    public class Foo
    {
        public Data Data;
    
        void method(Foo foo)
        {
            foo.Data.val = 10;
        }
    }
    

    如果您想让struct DataFoo 更明显相关,您可以将它们都放在嵌套命名空间中:

    namespace FooThings
    {
        public struct Data
        {
            public int val;
        }
    
        public class Foo
        {
            public Data Data;
    
            void method(Foo foo)
            {
                foo.Data.val = 10;
            }
        }
    }
    

    注意:您的 OP 的实际错误是 "The type 'Demo.Foo' already contains a definition for 'Data'"(在修复缺少的“;”之后)。

    【讨论】:

      【解决方案3】:

      改变

      public Data Data;
      

      public Data data;
      

      然后

      void method(Foo foo)
      {
          foo.data.val = 10;
      }
      

      【讨论】:

        猜你喜欢
        • 2013-12-24
        • 2019-09-28
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 2014-09-30
        • 2011-01-26
        • 2011-07-20
        • 1970-01-01
        相关资源
        最近更新 更多