默认情况下,该类的行为不属于内部类

时间:2018-09-09 17:11:40

标签: c# scope

当我在c#Windows应用程序项目中定义一个类时,该类应该在项目内部可用。

因此,我应该能够在表单中声明这种类型的类,而无需将我的类定义为公共类。

但是我遇到了一个可访问性错误,当将我的类重新定义为public而不是默认值(默认值应该在程序集内部)时,该错误消失了。

这不是重复的问题。这个问题不同于我看到的其他可访问性问题。

项目中的所有项目(窗体,类等)都应属于同一程序集,所以怎么回事?

默认的类范围是内部的吗?研究说,它应该是内部的,因此该代码应该可以工作。...

我明白了... “不一致的可访问性。与Form1.Queue相比,字段类型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 个答案:

答案 0 :(得分:1)

因此,如果所涉及的类型是

,请在问题中添加一些猜测。
internal class Queue

然后很明显

public Queue queue;

是错误-您具有public类型的internal字段。您希望它如何工作?问题不在于您的Form无法访问Queue。这是因为您项目外部的东西可以访问Form可以访问public字段,但是却没有访问该字段的类型。那没有任何意义,您如何期望外部类理解其无法访问的类型的字段?

如果将Queue声明为public-问题消失了,则该类型现在在外部可见。 如果将字段声明为internal(甚至是private),错误也会消失,因为任何访问该字段的人都可以访问该类型。

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

public Queue Queue {get; set;}

答案 1 :(得分:0)

您的表单被声明为public,并且包含您的Queue类的公共字段。由于Queue不是公开的,因此编译器拒绝编译您的代码。如果您希望Queue位于内部,请将该字段声明为internalprivate