2013-10-18 45 views
0

我的Visual Studio 2010的編譯器可訪問性不一致的錯誤認定參數類型的錯誤可訪問性不一致,當我編譯此C#代碼:與通過嵌套類作爲函數參數

class Program 
{ 
    class BaseClass 
    { 
     public class NestedClass 
     { 

     } 
    } 

    public static bool Function1(BaseClass.NestedClass obj) 
    { 
     return true; 
    } 

    static void Main(string[] args) 
    { 
     Function1(new BaseClass.NestedClass()); 
     new BaseClass.NestedClass(); 
     Console.ReadLine(); 
    } 
} 

但是當我FUNCTION1評論它的工作原理。

class Program 
{ 
    class BaseClass 
    { 
     public class NestedClass 
     { 

     } 
    } 

    //public static bool Function1(BaseClass.NestedClass obj) 
    //{ 
    // return true; 
    //} 

    static void Main(string[] args) 
    { 
     //Function1(new BaseClass.NestedClass()); 
     new BaseClass.NestedClass(); 
     Console.ReadLine(); 
    } 
} 

爲什麼可以創建NestedClass但不能是參數?

編輯:對不起,我是不是我的問題相當精確。以上我試着在控制檯應用程序重建的問題,但在我的項目,我有類等結構:

  class BaseClass 
      { 
       public class NestedClass 
       { 

       } 
      } 

    public class OtherClass 
    { 
      public void Function1(BaseClass.NestedClass param)  
       { 
        var newObj = new BaseClass.NestedClass(); 
       } 
    } 

PS:設置BaseClass的公共真正解決我的問題。現在,由於答案和意見,我明白,這是因爲公共功能1比內部(默認)BaseClass的更大的便利。但我不明白爲什麼我可以無錯地創建新的NestedClass對象?

+5

的'BaseClass'默認情況下'private'。 'NestedClass'不能在BaseClass之外訪問,因爲'BaseClass'是私有的。將'BaseClass'更改爲'public'。 – William

回答

3

頂層類型默認爲內部,但嵌套類型默認爲私有。因此,你有一個內部類型的公有方法,它有一個私有類型作爲參數。使所有的訪問修飾符明確:

internal class Program 
{ 
    private class BaseClass 
    { 
     public class NestedClass {} 
    } 

    public static bool Function1(BaseClass.NestedClass obj) 
    { 
     return true; 
    } 

    private static void Main(string[] args) 
    { 
     Function1(new BaseClass.NestedClass()); 
     new BaseClass.NestedClass(); 
     Console.ReadLine(); 
    } 
} 

這意味着在裝配其餘任何代碼可以「看到」 Function1但不明白 - 因此可訪問性不一致的錯誤。

您可以通過要麼內部或公共通過使Function1私人使得BaseClass解決這個問題。需要注意的是BaseClass不必是公共的,只是因爲Function1是公共的,因爲訪問域的Program只是包含它的裝配。這使得Function1的可訪問性域相同。有關更多詳細信息,請參閱C#規範的3.5.2節。

就我個人而言,我會避免使用嵌套類過於沉重 - 當你有嵌套類型的嵌套類型時,我會強烈考慮重新設計。

+0

謝謝!其實?我只是試圖把這個問題放到我的項目的控制檯應用程序中,並且在嵌套類型中沒有嵌套類型。我只是覺得這件事很奇怪,我可以創建嵌套類類型的新對象,不能把它作爲參數 – SENya

+0

@ user2893207:我很困惑 - 你絕對*有*有你的問題,一個雙嵌套類型。你是說這不是你的真實代碼嗎?當有兩套代碼需要討論時,這使得討論事情變得非常困難。 –

+0

對不起,我現在編輯了問題。當我在項目中遇到這個問題時,我嘗試在控制檯應用程序中重新創建它,然後發佈。 – SENya

1

他們有不同的訪問級別。你必須聲明你的BaseClass是public或者internal。

public class BaseClass 
    { 
     public class NestedClass 
     { 

     } 
    } 
+0

它不需要公開。它可能是內部的。它必須至少具有與引用它的方法一樣大的可訪問性域。 –

+0

@Jon Skeet你是對的。我錯誤地回答了我的答案。 – Jermay