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。真不敢相信。你让我意识到我实际上做得和平时不一样。这很奇怪,因为我通常不这么做