none
コンパイラ エラー「CS0433」について RRS feed

  • 質問

  • コンパイラ エラー「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 共に存在

    しているのでコンパイルエラーとなってしまっているのですが、コンパイルオプション指定以外に

    回避する方法はないものでしょうか?

     

    的を得ていない質問かもしれませんが、ご教授の程、お願いできませんでしょうか。

     

    2007年7月24日 3:24

回答

  • もう1つ気になるのは、「エイリアス」プロパティを指定した時点で、「MyControlLib1::」や「MyControlLib2::」を

    指定してやらないと、

    「エラー 'MyControlLibrary' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 」

    とコンパイルエラーが出ます。

    エイリアスの仕様です。

    同じ名前のクラスが複数あるため、コンパイラが区別できるように指定する必要があります。

     

    できれば同じ名前のクラスを作らないようにデザインするべきでしょう。

    どうしても同じ名前のクラスを作りたいのならば、ネームスペースを変えるという手もあります。

     

    参考:

    MSDNライブラリ:名前空間の名前

    2007年7月25日 4:40

すべての返信

  • ソリューションエクスプローラの参照設定フォルダに入っているアセンブリのプロパティを見ると

    エイリアスというプロパティがあるので、それを変更してください。

     

     

    2007年7月24日 7:16
  • 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()」内は書き換えられてしまう様な気がするのですが。

     

    使い方、指定の仕方、間違っているのでしょうか?

     

    2007年7月25日 0:51
  • もう1つ気になるのは、「エイリアス」プロパティを指定した時点で、「MyControlLib1::」や「MyControlLib2::」を

    指定してやらないと、

    「エラー 'MyControlLibrary' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 」

    とコンパイルエラーが出ます。

    エイリアスの仕様です。

    同じ名前のクラスが複数あるため、コンパイラが区別できるように指定する必要があります。

     

    できれば同じ名前のクラスを作らないようにデザインするべきでしょう。

    どうしても同じ名前のクラスを作りたいのならば、ネームスペースを変えるという手もあります。

     

    参考:

    MSDNライブラリ:名前空間の名前

    2007年7月25日 4:40
  • ishiharajunichiさん、回答ありがとうございます。

     

    >エイリアスの仕様です。

    なるほど。分りました。

     

    作り方(構成)について再考してみます。

     

    ありがとうございました。

     

    2007年7月25日 23:11