Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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#_.net_Winforms - Fatal编程技术网

C# 无法访问嵌套类或基类的成员

C# 无法访问嵌套类或基类的成员,c#,.net,winforms,C#,.net,Winforms,我写的一个类有一些奇怪的问题。我无法访问帐户中的任何内容,除非我直接从帐户访问它。无论什么 我希望能够做到: Account account = new Account(); account.Name... 但我不能。在智能感知中什么都没有出现。我只能在以下情况下访问内容: 账户。-例如,账户。账户持有人… class Account { class AccountHolder { enum Salutation { Mr

我写的一个类有一些奇怪的问题。我无法访问
帐户
中的任何内容,除非我直接从
帐户访问它。无论什么

我希望能够做到:

Account account = new Account();
account.Name...
但我不能。在智能感知中什么都没有出现。我只能在以下情况下访问内容:

账户。
-例如,
账户。账户持有人…

class Account
{
    class AccountHolder
    {
        enum Salutation
        {
            Mr,
            Mrs,
            Ms,
            Miss,
            Dr,
            Hon
        }

        struct Name
        {
            public string FirstName { get; set; }
            public string MiddleName { get; set; }
            public string LastName { get; set; }
        }

        enum Sex
        {
            Male,
            Female
        }
    }
}
我不明白发生了什么事。请注意,我也尝试了各种可能的组合,但这里有些地方非常错误。我已尝试将
public
添加到我的Account类中。我已尝试将
public
添加到AccountHolder类中。我试过使用
publicstatic

我以前从来没有遇到过这个问题。为什么不管我怎么改变,我都会遇到同样的问题


Account
类位于同一winforms项目中的
Account.cs
文件中。

您试图访问嵌套的
结构
枚举
。应该使用嵌套类名完成,例如,
Account.name

但是如果你有

class Account
{
    public struct Name
    {
        public string FirstName { get; set; }
        public string MiddleName { get; set; }
        public string LastName { get; set; }
    }

    public Name MyName {get; set;}
}

然后,您可以使用
Account
类的实例访问
MyName
属性。

这就是语言的工作方式

您可能希望在这里使用的是名称空间。任何嵌套类都必须使用其父类进行完全限定。如果使用名称空间,则该名称空间中的任何内容都可以一起使用,而无需完全限定,并且可以通过完全限定或插入
using
指令(
using Accounting;
在本例中)在名称空间之外使用(在访问修饰符的范围内)

另外,您确定要使用结构吗?值类型是不可变的,因此如果您更改该结构的任何成员,您总是在创建该结构的一个全新实例(通常效率要低得多)

命名空间记帐
{
类别帐户
{
公共PersonName名称{get;set;}
公共性别{get;set;}
公共称呼称呼{get;set;}
}
类人名
{
第一个公共字符串{get;set;}
公共字符串中间{get;set;}
公共字符串Last{get;set;}
}
枚举称呼:字节
{
先生
夫人
太太
错过,
博士
阁下
}
枚举:字节
{
男,,
女性
}
}
一个真正的问题可能是:为什么需要在这里?

当没有其他类型不能重用父类型的类型时,尤其是当嵌套类型应公开仅适用于父类型的属性或值时,可以使用嵌套类型。否则,最好创建独立类型

在我看来,您可以在
账户持有人
类别之外使用
称呼
枚举,因为账户持有人只不过是一个法律实体,也就是一个真实的人或公司

如果您的系统可以在其他地方使用
saltation
,那么最好在自己的文件中为自己创建枚举,并从
AccountHolder
类中公开属性

问候

public enum Salutation {
    Mr
    , Mrs
    , Ms
    , Miss
    , Dr
    , Hon
}
public class Person : LegalEntity {
    public Salutation Salutation { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get { return base.Name; } set { base.Name = value; } }
    // Some other members specific to a person here...
}
账户持有人

public class AccountHolder {
    public Salutation Salutation { get; set; }
    // ...
}
在后一种情况下,你可能还需要立即知道账户持有人是什么?

它可能是一家公司、一个人、一个客户、一个供应商,还是其他人

也许你会考虑定义账户持有者的等级,使它成为最普通的类别类型的财产。< /P> 合法性

public class LegalEntity {
    public string Name { get; set; }
}
public class Company : LegalEntity {
    // Some members specific to a Company here...        
}
公司

public class LegalEntity {
    public string Name { get; set; }
}
public class Company : LegalEntity {
    // Some members specific to a Company here...        
}

public enum Salutation {
    Mr
    , Mrs
    , Ms
    , Miss
    , Dr
    , Hon
}
public class Person : LegalEntity {
    public Salutation Salutation { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get { return base.Name; } set { base.Name = value; } }
    // Some other members specific to a person here...
}
然后,您就有了您的帐户

public class Account {
    public LegalEntity AccountHolder { get; set; }
}
因此,我的观点是,根据您的需要,嵌套类型在这里没有任何用处,这显然是我没有意识到的。事实证明,
账户持有人
现在可能是从
法律属性
衍生出来的任何类型。稍后,当需要另一种类型的
AccountHolder
时,您可以简单地从
LegalEntity
派生,或者从中实际派生的任何其他类型使其成为
AccountHolder
,因为
AccountHolder
只是
帐户的属性,而不是类本身

适当使用
嵌套类型的一些示例:

此外,您需要将嵌套类型公开,以便从类外部访问它们。这并不意味着可以避免使用Parent.NestedType命名法,但您不能

除此之外,我认为你的代码没有问题。根据定义,嵌套类型隐藏在另一个类型中。因此,当您希望访问它们时,始终需要键入包含您需要访问的类型的父名称


另外,一旦可以访问嵌套类型,您就必须在
帐户中创建成员
类,以保存对这些嵌套类型实例的引用。嗯,在这里使用它们没有好处。但是,嘿,我坚持,我不知道你的现实和你设计背后的选择。

你使用的是什么版本的Visual Studio?@FarhadJabiyev请忽略这个错误。我想在问题中写的是账户。账户持有人@bytebender我正在使用Visual Studio 2014终极CTP。但是我已经用了一个月了,这是我第一次遇到这个问题。谢谢@dodecahedron,我不知道关于structs。我过去很少使用它们。只是用一个代码示例更新了答案,说明了应该如何进行布局。谢谢@Alex。真不敢相信。你让我意识到我实际上做得和平时不一样。这很奇怪,因为我通常不这么做