2010-07-05 24 views
1

如果我在一個文件中聲明一個接口或一個類型爲private,它是否對該文件或名稱空間是私有的?類型可訪問性取決於它所包含的文件嗎?

編譯器產生用於文件2的錯誤:'錯誤14可訪問性不一致:參數類型‘DIDemo1.IImageRepository’比方法更少可訪問的‘DIDemo1.ImageGetter.ImageGetter(DIDemo1.IImageRepository)’

什麼我不不明白的是,MyClass可以使用接口,但ImageGetter類不能。

文件1:

namespace DIDemo1 { 

    interface IImageRepository { 

     Image[] GetImages(); 
    } 

    public class MyClass : IImageRepository { 

     #region IImageRepository Members 

     public Image[] GetImages() { 
      return new Image[] { }; 
     } 

     #endregion 
    } 
} 

文件2:

namespace DIDemo1 { 

    public class ImageGetter { 

     IImageRepository _repo; 

     public ImageGetter(IImageRepository repository) { 
      _repo = repository; 
     } 

     public Image[] GetImages() { 

      return _repo.GetImages(); 
     } 
    } 
} 

回答

1

我不明白的是,MyClass的可以使用的界面,但ImageGetter類不能。

ImageGetter 可以使用的接口,它只是不能在其方法簽名更容易訪問的一個出示。同樣,如果MyClass試圖在它的一個方法簽名中使用它,你會得到相同的錯誤。參見下文。


頂級接口,結構和類默認爲internal訪問。在你的界面聲明之前修復你的問題public

internal C#中的類型只能在同一個程序集中訪問。 出於顯而易見的原因,您不能在限制較少的簽名中使用更具限制性的訪問修飾符。 (例如,一個不能訪問限制性較強的類型的人怎麼稱呼這個函數?)

+0

類也默認爲內部訪問,只是他明確地將'public'放在它們上面。 – 2010-07-05 00:40:56

+0

雅修正:錯誤是從這裏:http://msdn.microsoft.com/en-us/library/ms173121(VS.80).aspx – 2010-07-05 00:44:30

+0

我喜歡你的解釋。現在有道理。 – 2010-07-05 01:02:01

3

由於你沒有爲你的接口指定一個訪問修飾符,所以它默認爲internal,它低於public。這意味着只有同一個程序集中的代碼才知道它的存在。

一個公共類可以實現一個內部接口,因爲在同一個程序集中的其他代碼可以看到你的類有接口,而外面的代碼只會看到公共類,而沒有接口。

然而,在文件2,你這是該類的合同公開的內部接口部分 - 也就是你的類是公共的,這意味着任何代碼都可以看到它,但是爲了使用它,他們還必須能夠理解構造函數中的類型。由於構造函數中需要的類型之一是內部的,所以外部代碼無法理解它,並且這個合同是不可能實現的。

+0

+1 - 擊敗我:) – 2010-07-05 00:40:34

0

不,代碼所在的文件是不相關的。該接口對於命名空間是私有的,而不是文件。

錯誤消息不是因爲ImageGetter類無法訪問接口,這是因爲該類不能從名稱空間外使用。

區別在於您如何使用界面。類MyClass只實現接口,所以即使無法使用接口,仍然可以使用該類。ImageGetter類中的構造函數需要對該接口進行引用,所以如果沒有訪問接口的權限,則不能使用該類。

0

接口和類默認爲內部可訪問性(因爲在名稱空間內沒有類是私有的概念)。錯誤解釋了發生了什麼 - IImageRepository不易訪問(它是內部的)構造函數,它公開IImageRepository作爲參數。

基本上公開的方法ImageGetter公開了一種內部類型。這在C#中是不允許的。

相關問題