アプリ版:「スタンプのみでお礼する」機能のリリースについて

C#の.NETでWindowsアプリを作成しております。
C++/CLI経験はありますが、C#は全くの素人です。

AクラスからBクラスに、Cクラスを参照渡しで渡し、
BクラスにてCクラスのメンバ変数の値を書き換えた後、
Aクラスでその値を使用するといったプログラムを作成しようと思っています。

Bクラスを生成する際に、コンストラクタの引数渡しにて、
Cクラスを渡す書き方をしたのですが、下記エラー

エラー CS0051: アクセシビリティに一貫性がありません。
パラメータの型 'ref Test.C' のアクセシビリティは
メソッド 'Test.B.B(ref Test.C)' よりも低く設定されています。

が発生してしまい、解決法が分かりません。
何か根本的なことが間違っているのでしょうか。。

解決策をご存知の方おられましたら、ご教示お願い致します。

下記にサンプルコードを記載します。

【Aクラス】
B b = new B( C c );

【Bクラス】
namespace Test
{
public partial class B : Form
{
public B(ref C c)// コンストラクタ
{
InitializeComponent();
}
}
}

【Cクラス】
namespace Test
{
class C
{
public int hoge;
}
}

A 回答 (2件)

アクセス修飾子というのは,publicやinternalを指します。


Cは省略されているため,internalになっています。

よって,
public B(ref C c)
を,
internal B(ref C c)
とするのが,
> メソッドのアクセス修飾子を引数の型のアクセス修飾子にあわせる
の方法になります。
    • good
    • 0
この回答へのお礼

ご丁寧なご解説ありがとうございます。
サンプルコードを下記のように修正し解決することが出来ました。
ありがとうございました。

【Aクラス】
C c = new C()
B b = new B( ref c );

【Bクラス】
namespace Test
{
public partial class B : Form
{
internal B(ref C c) // コンストラクタ
{
InitializeComponent();
}
}
}

お礼日時:2010/03/10 15:23

エラーの通りなのですが……。



publicなクラスに含まれるpublicなメソッドの引数の型として,internalなクラスを指定していますが,
メソッドのアクセス修飾子よりも引数の型のアクセス修飾子の方が厳しいものになっています。
結果として,このメソッドを利用可能になるのは,引数の型のアクセス修飾子の範囲になってしまっています。

解決するには,
・メソッドのアクセス修飾子を引数の型のアクセス修飾子にあわせる
・引数の型のアクセス修飾子をメソッドのアクセス修飾子の範囲まで引き上げる
のどちらかの対策が必要です。
# お勧めは前者。後者はそもそも引数の型のアクセス修飾子を間違えている場合のみに使う。

この回答への補足

御回答ありがとうございます。
エラーの原因は大体理解できたのですが、
解決法をコードにすることが出来なく悩んでいます。

>・メソッドのアクセス修飾子を引数の型のアクセス修飾子にあわせる
というのは、具体的にはどうコードを修正すれば良いのでしょうか?

補足日時:2010/03/10 14:04
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!