none
ジェネリックの「型リスト」 RRS feed

  • 質問

  • 簡単な構造体を利用しています。

    これまでは数個のInteger型を格納していましたが、同じ構造体のをDouble型バージョンを作る必要が生じました。

    ジェネリックを利用して、型に制限を設けることで実現できないかと思いましたが、Math.Maxメソッドなどを利用したいため、IComparableなどでは弱すぎます。

    想定しているのは2つの型だけですので、

    Public Structure test (Of {Integer, Double})

    と言ったイメージで、「型のリスト」を与えて制約できないかと思いましたが、そのような方法は見当たりませんでした。

     

    単純に、IntとDbl2つの別個の構造体を作るのが早道なのでしょうか?

    うまい解決方法をお持ちの方は、どうぞよろしくお願いいたします。

    2011年11月16日 3:23

回答

  • 個別の構造体を作ってください。

    // そういう制約ができるなら、Enumerable.Max などがあんなにたくさんオーバーロードを持つことはなかったでしょう。
    • 編集済み Hongliang 2011年11月16日 4:45 余談追加
    • 回答としてマーク terasato 2011年11月16日 4:58
    2011年11月16日 4:10

すべての返信

  • 個別の構造体を作ってください。

    // そういう制約ができるなら、Enumerable.Max などがあんなにたくさんオーバーロードを持つことはなかったでしょう。
    • 編集済み Hongliang 2011年11月16日 4:45 余談追加
    • 回答としてマーク terasato 2011年11月16日 4:58
    2011年11月16日 4:10
  • >// そういう制約ができるなら、Enumerable.Max などがあんなにたくさんオーバーロードを持つことはなかったでしょう。

    なるほど。確かに。

    ありがとうございます。

    諦めがつきました。

     

    2011年11月16日 4:58
  • 型パラメータに対して Math.Max を使うのは色々大変ですよ?

    素直に2種類作成するか、int, double 以外にも広げて妥協するのが近道じゃないでしょうか。

    public struct Test<T> where T : struct, IComparable<T>
    {
        public T Value1;
        public T Value2;
        public T Value3;
    
        // コンパイルエラー
        public T MaxValue
        {
             return Math.Max(Math.Max(
                             this.Value1, this.Value2), this.Value3);
        }
    
        // コンパイル&実行可能。IComparable が使用される
        public T MaxValue2
        {
            return new T[] { this.Value1, this.Value2, this.Value3 }.Max();
        }
    
        // コンパイル可能&型によっては実行時にエラー
        public static Func<T, T, T> Max;
        public T MaxValue3
        {
            if (Max == null)
                Max = typeof(Math).GetMethod("Max", ...);
    
            return Max(Max(this.Value1, this.Value2), this.Value3);
        }
    }
    
    

     

    2011年11月16日 5:00