【问题标题】:class not behaving as internal by default默认情况下,类不表现为内部
【发布时间】:2018-09-10 01:20:02
【问题描述】:

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

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

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

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

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

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

我明白了…… “可访问性不一致。字段类型 Queue 的可访问性不如 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;
        }


    }
}

【问题讨论】:

  • 显示Queue的定义
  • 您不能让内部字段公开可见
  • 您不能公开内部或私有类型的公共属性/字段。
  • 这不是真的,类的默认范围是内部的。在 msdn 之后:>“直接在命名空间中声明的类和结构(换句话说,不嵌套在其他类或结构中)可以是公共的或内部的。如果没有指定访问修饰符,则默认为内部。”
  • @V0ldek 检查表docs.microsoft.com/en-us/dotnet/csharp/language-reference/…。它支持你的说法,

标签: c# scope


【解决方案1】:

因此,如果有问题的类型是

,则通过对您的问题添加一些猜测
internal class Queue

那么,很明显,

public Queue queue;

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

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

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

public Queue Queue {get; set;}

【讨论】:

  • 感谢详细的细分。它有助于我理解。
【解决方案2】:

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

【讨论】:

  • 即使我定义为“内部”,问题也不会消失。它迫使我宣布为公众,然后它就消失了。此外,内部应该是默认范围......
  • 也许你误会了我。看看 V0ldeks 的答案。他更详细地解释了我的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2010-12-02
  • 2012-11-24
相关资源
最近更新 更多