2012-02-22 21 views
2

"オブジェクト 'にx引数を取るコンストラクタが含まれていないというエラーを返す次のコードがあります。ベースコンストラクタを呼び出そうとしている行に基本コンストラクタを呼び出すことができませんC#

ソリューション1、プロジェクト1

namespace Project.Sub.A 
{ 
    internal class Foo 
    { 
    internal Foo(int a, long b) {} 

    } 
} 

ソリューション1、プロジェクト2

namespace Project.Sub.B{ 
    internal class Bar : Foo 
    { 
    internal Bar(int a, long b,long c) :base(a,b+c) {} 

    } 
} 

私はこの仕事をしたいしない理由はわかりません。私の名前空間が正しく構成されていない可能性がありますか?

答えて

8

internalアクセスはアセンブリで、ネームスペースではありません。

基本クラスのコンストラクタはinternalと宣言されているため、他のプロジェクトのサブクラスではアクセスできません。それをprotected internalまたはprotectedに変更してみてください。

更新

ただ、基本クラスもinternalであることに気づきました。 2番目のプロジェクトに表示する場合は、publicにする必要があります。または、Project1のAssemblyInfo.cs[assembly:InternalsVisibleTo("Project2")]を追加できます。 (私は個人的にかかわらず、このオプションはお勧めしません。)

+0

私はこれを試しましたが、運はありません。 – Vort3x

+0

あなたはそのプロジェクトを別のプロジェクトでどのように知っていますか? – Jon

+4

@Jonそう言っているから...解決策1、プロジェクト2 –

2

内部手段visible to other classes in the current assembly

2番目のプロジェクトで2番目のクラスを定義しているので、それは基本コンストラクタを見ることができません。

代わりにFooクラス&コンストラクタprotectedまたはinternalを作成してください。

2

質問が示唆しているように別のプロジェクトにあり、基本クラスがinternalとマークされている場合は、コンストラクタを除いて型全体を見つけることができません。

Fooのアクセサをpublicに変更します。

+0

アクセス修飾語を意味しましたか?アクセサーは 'get'メソッドですか? – Vort3x

3

ここには多くの混乱の問題があります。

  • まず、クラスは2つの別々のプロジェクトで内部として定義されています。 internalは、クラスが独自のアセンブリ内でのみ表示され、アセンブリ外のクライアントコードでは表示されないことを意味します。他のアセンブリで使用できるようにpublicにする必要があります
  • クラスFooをアセンブリの外部に表示させる場合は、クラスバーを含むプロジェクトからそのアセンブリを参照する必要があります
  • そして、名前空間も正しく参照されていることを確認してください。
関連する問題