2014-05-04 45 views
2

我有一个类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; 
    } 
} 

回答

2

你的方法:

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

它返回一个Indicators目的,是public知名度。然而,Indicators类型本身不是public,它是internal(默认情况下,因为您没有指定它;有关更多信息,请参阅this answer)。

声明类别Indicatorspublic来解决问题,或将方法ShowForm设置为internal

编辑:

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

他是会得到一个参考指向一个Indicators但是从他的角度来看(其实从他组装的角度来看),他不知道是什么类Indicators是,因为它的知名度internal(正如我所说, 默认)。 internal元素不会暴露给与public元素相反的其他程序集。这造成了不一致,并且它是编译器抱怨的原因。

2

这意味着,自ShowFormpublic返回类型也必须public

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中,如果你实例化类区外的类,然后要么应该是内部的或公共的代码访问..否则就像你创建类为私人(如果没有代码访问实现作为你的实现指标 - 类指标 - 编译器接受为私有的,你不能访问出类)

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

当你的类的代码访问是公共的,然后应该是所有实例/方法内来电或应该是公开的,如果是内部则可以是内部的或私有的或受保护