为了账号安全,请及时绑定邮箱和手机立即绑定

默认情况下,类不表现为内部

默认情况下,类不表现为内部

C#
森林海 2022-01-09 16:20:32
当我在我的 c# windows 应用程序项目中定义一个类时,该类应该在项目内部可用。所以我应该能够在我的表单中声明那种类型的类,而无需将我的类定义为公共类。但是我遇到了一个可访问性错误,当我的类被重新定义为公共而不是默认值(它应该是程序集的内部)时,它就会消失。这不是一个重复的问题。这个问题与我见过的其他可访问性问题不同。我项目中的所有项目(表单、类等)都应该属于同一个程序集,那么发生了什么?类的默认范围是否是内部的?研究表明它应该是内部的,所以这段代码应该可以工作......我得到......“不一致的可访问性。字段类型队列比 Form1.Queue 更难访问”请参阅下面的代码。namespace WindowsFormsApplication3{    public partial class Form1 : Form    {        public Queue Queue;          // <-- PROBLEM LINE        public Form1()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {        }    }}这是队列的定义;我不认为它真的很重要,但它是由评论者要求的;当我公开课程时,所有问题都解决了。但是,如果默认范围应该是内部的,那就没有意义了,它不应该强迫我公开:namespace WindowsFormsApplication3{    class Queue    {        private const int DEFAULTQUEUESIZE = 100;        private int[] data;        private int head = 0, tail = 0;        private int numElements = 0;        public Queue()        {            this.data = new int[DEFAULTQUEUESIZE];        }        public void Enqueue(int item)        {            if (this.numElements == this.data.Length)            {                throw new Exception("Queue full");            }            this.data[this.head] = item;            this.head++;            this.head = this.head % this.data.Length;            this.numElements++;        }        public int Dequeue()        {            if (this.numElements == 0)            {                throw new Exception("Queue Empty");            }            int queueItem = this.data[this.tail];            this.tail++;            this.tail = this.tail % this.data.Length;            this.numElements--;            return queueItem;        }    }}
查看完整描述

2 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

因此,通过在您的问题中添加一些猜测,如果有问题的类型是

internal class Queue

那么,很明显,

public Queue queue;

是一个错误 - 你有一个类型的public字段internal。你希望它如何工作?问题不在于您Form无法访问Queue. 这是您项目外部的某些东西可以访问Form,可以访问该public字段,但它无权访问该字段的类型。这没有任何意义,您如何期望外部类能够理解它无法访问其类型的字段?

如果您声明Queuepublic- 问题就消失了,该类型现在在外部可见。如果您将该字段声明为internal(或什至private) - 错误也会消失,因为访问该字段的任何内容也可以访问该类型。

我希望这能解释这个问题。附带说明:声明public字段通常是一个错误,如果您希望它可以从外部访问,请使用属性:

public Queue Queue {get; set;}


查看完整回答
反对 回复 2022-01-09
?
红颜莎娜

TA贡献1842条经验 获得超13个赞

您的 Form 已声明public并包含 Queue 类的公共字段。由于Queue不公开,编译器拒绝编译您的代码。如果您想Queue成为内部的,请将该字段声明为internalprivate


查看完整回答
反对 回复 2022-01-09
  • 2 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号