我对C#编程很新,所以这可能是初学者的问题。
我得到“'A.Test.That.Fails'由于以下代码段中的保护级别”错误而无法访问,我无法理解原因。
namespace A
{
class Test
{
public void Demo()
{
That[] it = new That[42];
it[0].fails = 21;
}
public struct That
{
int fails;
}
}
}
来自C ++编程并且已经读过保护规则几乎相同,因为即使That
结构和Demo
方法都是{private
结构,我也希望它能够工作。 {1}}。
正如旁注所示,非常感谢指向C ++程序员总结范围和保护规则的某个页面的链接。
答案 0 :(得分:10)
其他答案已经有了答案,所以我不会在这里击败死马。您需要声明字段public
才能从外部代码访问它。
在C ++中,结构和类是等价的,唯一的区别是它们各自成员的默认访问级别。
然而,在C#中并非如此。通常,您只应将结构用于不可变(不会更改)的小型短期对象。结构具有值类型语义,其中类具有引用类型语义。如果您正在学习使用C#编程,那么理解值类型和引用类型之间的区别非常重要。 Jon Skeet发表了an article,试图提供这种解释。但你肯定希望为C#找一本好的入门书,更详细地讨论这些问题。
通常,您需要在C#中使用类,而不是结构。当您使用该类时,请注意Microsoft的C#设计指南倾向于建议反对公开公共字段。相反,他们建议您使用由私有字段支持的公共属性。更全面地阐述该指南背后的基本原理here。例如:
class TimePeriod
{
private double seconds;
public double Seconds
{
get { return seconds; }
set { seconds = value; }
}
}
或者您可以使用更简单的“自动属性”语法,该语法使编译器自动生成该私有支持字段:
class TimePeriod
{
public double Seconds { get; set; }
}
答案 1 :(得分:4)
C#中的结构字段(和类字段)的默认访问修饰符是private
。因此int fails;
对您的结构是私有的,除非您将其公开。
答案 2 :(得分:2)
默认情况下,该成员被声明为私有 - 您需要在其前面加上public
修饰符。
答案 3 :(得分:2)
答案 4 :(得分:1)
Test的私有成员限制测试本身,并且在Test之外不可用。演示不在测试范围内。父母是谁是无所谓。
在Test中定义Demo,您可以访问私有成员。