2014-05-04 66 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中,如果你實例化類區外的類,然後要麼應該是內部的或公共的代碼訪問..否則就像你創建類爲私人(如果沒有代碼訪問實現作爲你的實現指標 - 類指標 - 編譯器接受爲私有的,你不能訪問出類)

即使它是內部代碼訪問,並將其作爲公共引用,您也會得到相同的異常。

當你的類的代碼訪問是公共的,然後應該是所有實例/方法內來電或應該是公開的,如果是內部則可以是內部的或私有的或受保護