トップ回答者
コンパイラ エラー「CS0433」について

質問
-
コンパイラ エラー「CS0433」についてなのですが、
http://msdn2.microsoft.com/ja-jp/library/64wh5743(vs.80).aspx
「このエラーを解決するには、/reference コンパイラ オプションのエイリアス機能を使用」
とありますが、この「/reference」コンパイルオプションは、コマンドライン(csc.exe)からの
ビルド時にしか指定できないのでしょうか?
Visual Studioの画面からのビルド時には指定できないのでしょうか?
具体的に、
次の様なカスタムコントロールをフォームに配置した場合にコンパイルエラーになっています。
カスタムコントロール1:(MyControlLibrary1.dll)
namespace MyControlLibrary
{
public partial class MyControl1 : TextBox
{
private MyPropClass _myprop = new MyPropClass();public MyPropClass MyProp
{
get { return _myprop; }
set { _myprop = value; }
}}
}カスタムコントロール2:(MyControlLibrary2.dll)
namespace MyControlLibrary
{
public partial class MyControl2 : CheckBox
{
private MyPropClass _myprop = new MyPropClass();public MyPropClass MyProp
{
get { return _myprop; }
set { _myprop = value; }
}
}
}ここに、「MyPropClass」が記述(宣言)されているソースファイルをプロジェクトにそれぞれ追加
(リンクとして追加)しています。
MyPropClass.cs:
namespace MyControlLibrary
{
public class MyPropClass
{
}
}これによって、
Form1.Designer.cs内の InitializeComponent() の
MyControlLibrary.MyPropClass myPropClass1 = new MyControlLibrary.MyPropClass();
MyControlLibrary.MyPropClass myPropClass2 = new MyControlLibrary.MyPropClass();MyPropClassの宣言が、参照しているMyControlLibrary1.dll、MyControlLibrary2.dll 共に存在
しているのでコンパイルエラーとなってしまっているのですが、コンパイルオプション指定以外に
回避する方法はないものでしょうか?
的を得ていない質問かもしれませんが、ご教授の程、お願いできませんでしょうか。
回答
-
もう1つ気になるのは、「エイリアス」プロパティを指定した時点で、「MyControlLib1::」や「MyControlLib2::」を
指定してやらないと、
「エラー 'MyControlLibrary' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 」
とコンパイルエラーが出ます。
エイリアスの仕様です。
同じ名前のクラスが複数あるため、コンパイラが区別できるように指定する必要があります。
できれば同じ名前のクラスを作らないようにデザインするべきでしょう。
どうしても同じ名前のクラスを作りたいのならば、ネームスペースを変えるという手もあります。
参考:
すべての返信
-
ishiharajunichiさん、回答ありがとうございます。
「エイリアス」プロパティにエイリアス名を指定してコンパイルしてみたのですが、
ワーニングがどうしても取れないのです。
「警告 'MyControlLibrary.MyPropClass' のオブジェクトを型 'MyControlLibrary.MyPropClass' に変換できません。」
Form1.Designer.cs:
private void InitializeComponent()
{
MyControlLib1::MyControlLibrary.MyPropClass myPropClass1 = new MyControlLib1::MyControlLibrary.MyPropClass();
MyControlLib2::MyControlLibrary.MyPropClass myPropClass2 = new MyControlLib2::MyControlLibrary.MyPropClass();
this.myControl11 = new MyControlLib1::MyControlLibrary.MyControl1();
this.myControl21 = new MyControlLib2::MyControlLibrary.MyControl2();
//
// myControl11
//
this.myControl11.MyProp = myPropClass1;
this.myControl11.Name = "myControl11";
//
// myControl21
//
this.myControl21.MyProp = myPropClass2; // *** ワーニング箇所 ***
this.myControl21.Name = "myControl21";}
private MyControlLib1::MyControlLibrary.MyControl1 myControl11;
private MyControlLib2::MyControlLibrary.MyControl2 myControl21;「エイリアス」プロパティには次の様にエイリアス名を指定。
MyControlLibrary1.dll -> MyControlLib1
MyControlLibrary2.dll -> MyControlLib2
もう1つ気になるのは、「エイリアス」プロパティを指定した時点で、「MyControlLib1::」や「MyControlLib2::」を
指定してやらないと、
「エラー 'MyControlLibrary' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 」
とコンパイルエラーが出ます。
ただ、Designer.cs内の「InitializeComponent()」内を手コーディングしたとしても、フォームのデザインを
変更した時点で、「InitializeComponent()」内は書き換えられてしまう様な気がするのですが。
使い方、指定の仕方、間違っているのでしょうか?
-
もう1つ気になるのは、「エイリアス」プロパティを指定した時点で、「MyControlLib1::」や「MyControlLib2::」を
指定してやらないと、
「エラー 'MyControlLibrary' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 」
とコンパイルエラーが出ます。
エイリアスの仕様です。
同じ名前のクラスが複数あるため、コンパイラが区別できるように指定する必要があります。
できれば同じ名前のクラスを作らないようにデザインするべきでしょう。
どうしても同じ名前のクラスを作りたいのならば、ネームスペースを変えるという手もあります。
参考: