class默认情况下不表现为内部

问题描述 投票:0回答:2

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

所以我应该能够在我的表单中声明这种类,而不将我的类定义为公共类。

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

这不是一个重复的问题。这个问题与我见过的其他可访问性问题不同。

我的项目中的所有项目(表单,类等)应该属于同一个程序集,那么发生了什么?

类的默认范围是否内部?研究表明它应该是内部的,所以这段代码应该可行....

我得到了......“可访问性不一致。字段类型队列比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;
        }


    }
}
c# scope
2个回答
1
投票

所以通过在你的问题中加入一些猜测,如果有问题的类型是

internal class Queue

然后,很明显,

public Queue queue;

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

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

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

public Queue Queue {get; set;}

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.