Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问名为其类型c的变量#_C#_Variables_Naming_Ambiguity - Fatal编程技术网

C# 访问名为其类型c的变量#

C# 访问名为其类型c的变量#,c#,variables,naming,ambiguity,C#,Variables,Naming,Ambiguity,在以下示例代码中: 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”之间存在歧义 知道如何在不重命名成员变量的情况下修复此错误吗?由于我是

在以下示例代码中:

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”之间存在歧义


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

这会发生,还有第二个更明显的错误,因为它们都有相同的完全限定名–它们都是
Foo
的成员


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

这会发生,同时还会出现第二个更明显的错误,因为它们都有相同的完全限定名–它们都是
Foo
的成员


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

除了将嵌套结构移到类外(或重命名已明确排除的属性),无法执行此操作:

如果要使结构数据更明显地与
Foo
相关,可以将它们都放在嵌套的命名空间中:

namespace FooThings
{
    public struct Data
    {
        public int val;
    }

    public class Foo
    {
        public Data Data;

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

注意:OP的实际错误是
“类型'Demo.Foo'已包含'Data'的定义”
(在修复丢失的“;”)。

除了将嵌套结构移到外部(或重命名已明确排除的属性),您无法执行此操作:

如果要使结构数据更明显地与
Foo
相关,可以将它们都放在嵌套的命名空间中:

namespace FooThings
{
    public struct Data
    {
        public int val;
    }

    public class Foo
    {
        public Data Data;

        void method(Foo foo)
        {
            foo.Data.val = 10;
        }
    }
}
注意:OP的实际错误是“类型'Demo.Foo'已经包含“数据”的定义”(在修复缺少的“;”之后)。

更改

public Data Data;

然后

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

public Data Data;

然后

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

这不是你唯一的问题
类型“UserQuery.Foo”已经包含“Data”的定义。
您发布的程序不会产生您描述的错误。@EricLippert:当我测试它时会产生,尽管我需要添加终止的
在字段声明之后。错误实际上是
“类型'Demo.Foo'已经包含'Data'的定义”
@EricLippert:进一步考虑,是的,它可以
classx{classy{publicstaticintz;}intz;xy;}
那么,
Y.z
可以是
Y
中的静态字段或
X
字段的实例字段。这不是您唯一的问题
类型“UserQuery.Foo”已经包含“Data”的定义。
您发布的程序不会产生您描述的错误。@EricLippert:当我测试它时会产生,尽管我需要添加终止的
在字段声明之后。错误实际上是
“类型'Demo.Foo'已经包含'Data'的定义”
@EricLippert:进一步考虑,是的,它可以
class X{class Y{public static int z;}int z;X Y;}
然后,
Y.z
可以是
Y
中的静态字段或
X
字段的实例字段。