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 を public に設定することで、私の問題は本当に解決しました。さて、回答とコメントのおかげで、public Function1 は internal (デフォルト) BaseClass よりも優れたアクセシビリティを備えているためであることがわかりました。しかし、エラーなしで新しい NestedClass オブジェクトを作成できる理由がわかりません。

4

2 に答える 2

3

最上位の型はデフォルトで internal になりますが、ネストされた型はデフォルトで private になります。したがって、プライベート型をパラメーターとして持つパブリック メソッドを持つ内部型が得られます。すべてのアクセス修飾子を明示的にする:

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が、理解することはできません。したがって、一貫性のないアクセシビリティ エラーが発生します。

これは、内部または公開にする、非公開にすることで修正できます。のアクセシビリティ ドメインはそれを含むアセンブリにすぎないため、パブリックであるという理由だけで、 がパブリックである必要はないことに注意してください。これにより、アクセシビリティ ドメインが同じになります。詳細については、C# 仕様のセクション 3.5.2 を参照してください。BaseClassFunction1BaseClassFunction1ProgramFunction1

個人的には、入れ子になったクラスを過度に使用することは避けます。入れ子になった型内に入れ子になった型が存在するようになるまでには、再設計を強く検討します。

于 2013-10-18T05:52:27.800 に答える
1

アクセスレベルが異なります。BaseClass public または internal を宣言する必要があります。

public class BaseClass
    {
        public class NestedClass
        {

        }
    }
于 2013-10-18T05:50:17.363 に答える