不兼容性可访问性错误,这意味着什么?

时间:2014-05-04 22:29:24

标签: c# windows-forms-designer

我有一个 Computer.cs 类,它属于计算机形式,我有一个独立的类指标。

在我的代码中我收到错误:

Incompatibility accessibility: accessibility return type "WF.Code.Indicators"
method is below than accessibility return type "WF.Computer.ShowForm ()"
这是什么意思?

Computer.cs

namespace WF
{
    public partial class Computer : Form
    {
        Code.Indicators indicators = new Code.Indicators();

        public Computer()
        {
            if (indicators.isComputerAlreadyRunning == false)
            {
                InitializeComponent();
                indicators.isComputerAlreadyRunning = true;
            }
        }

        public Code.Indicators ShowForm() // Error
        {
            return new Code.Indicators(indicators.isComputerAlreadyRunning);
        }
    }
}

Indicators.cs

namespace WF.Code
{
    class Indicators
    {
        public Indicators(bool isComputerAlreadyRunning)
        {
            this.isComputerAlreadyRunning = isComputerAlreadyRunning;
        }

        public bool isComputerAlreadyRunning = false;
    }
}

3 个答案:

答案 0 :(得分:2)

这意味着,由于ShowFormpublic,因此返回类型也必须为public

答案 1 :(得分:2)

你的方法:

    public Code.Indicators ShowForm() // Error
    {
        return new Code.Indicators(indicators.isComputerAlreadyRunning);
    }

它返回Indicators个对象,且public可见度。但是Indicators类型本身不是public,而是internal(默认情况下,因为您没有指定它;有关详情,请参阅this answer)。< / p>

将类Indicators声明为public以解决问题,或将方法ShowForm设置为internal

编辑:

为了更好地解释编译器抱怨的原因,想象您的代码实际上是编译到库中的。有人从另一个程序集中包含这个库来使用它,这个人会调用这个public方法ShowForm(因为他可以!)。

他将获得一个指向Indicators的参考,但从他的观点来看(实际上是从他的集会的角度来看),他不知道班级Indicators是什么是,因为它的可见性是internal(正如我所说,默认情况下)。与internal元素相反,public元素不会暴露给其他程序集。这会产生一种不连贯性,这就是编译器抱怨的原因。

答案 2 :(得分:1)

你指标类现在是:

namespace WF.Code
{
    class Indicators
    {
        public Indicators(bool isComputerAlreadyRunning)
        {
            this.isComputerAlreadyRunning = isComputerAlreadyRunning;
        }

        public bool isComputerAlreadyRunning = false;
    }
}

但应该是:

namespace WF.Code
{
   public class Indicators
    {
        public Indicators(bool isComputerAlreadyRunning)
        {
            this.isComputerAlreadyRunning = isComputerAlreadyRunning;
        }

        public bool isComputerAlreadyRunning = false;
    }
}

在.NET中,如果你在类'区域外实例化一个类,那么要么是内部代码访问还是公共代码访问..否则就像你创建类一样私有(如果没有代码访问实现作为你的Indicators实现 - 类指标 - 编译器接受它为私有,你不能访问该类)

即使是内部代码访问并且您将其作为公开引用,您也会得到相同的异常。

当你的班级代码访问是公开的时候应该是所有实例/内部方法或调用应该是公共的,如果它是内部的那么可以是内部的,私有的或受保护的