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
字段的实例字段。