generics を使った加算メソッド

C# で generics(総称性)を使って加算メソッドを作成します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. C# で generics(総称性)を使って加算メソッドを作成します。
    /************************************************/
    /*★ generics を使った加算メソッド    前田 稔 ★*/
    /************************************************/
    using System;
    
    class Class1
    {
        public static int Main()
        {
            Console.WriteLine("int ans= " + TestGeneric(10, 20));
            Console.WriteLine("float ans= " + TestGeneric(1.25f, 3.125f));
            Console.WriteLine("double ans= " + TestGeneric(12.3, 4.56));
            Console.WriteLine("string ans= " + TestGeneric("300", "400"));
            Console.ReadLine();
            return 0;
        }
        public static string TestGeneric<T>(T n1, T n2)
        {
            return Convert.ToString((Convert.ToDouble(n1) + Convert.ToDouble(n2)));
        }
    }
    
  2. C++ の template に相当する機能ですが、書き方は簡単でも使い勝手は今一です。 (^_^;)
    C++ では type parameter で受け取った引数に対して直接演算が出来るのに対して、C# では 四則演算や、 比較演算などをするとエラーになります。 (;_;)
    また、算術型の変数に代入しようと思ってもエラーになります。
    MSDN のページには次のような説明がありました。
    制約を使用する理由 
         ジェネリック リストの項目をチェックして、その項目が有効であるかどうかを確認したり、他の項目と比較したりする場合は、
         コンパイラが呼び出す必要がある演算子やメソッドが、クライアント コードで指定される可能性があるすべての型引数で
         サポートされるというある程度の保証をコンパイラに与える必要があります。
         この保証が、ジェネリック クラス定義に 1 つ以上の制約を適用することで得られます。
         たとえば、基本クラス制約では、この型のオブジェクトまたはこの型から派生したオブジェクトだけが型引数として使用される
         ことをコンパイラに伝えます。
         この保証が得られると、コンパイラは、その型のメソッドをジェネリック クラス内で呼び出すことを許可できます。
         制約は、where コンテキスト キーワードを使用して適用します。
         基本クラス制約を適用することによって、「ジェネリックの概要 (C# プログラミング ガイド)」 の GenericList<T> 
         クラスに追加できる機能を次のコード例に示します。
  3. C# では type parameter で受け取った引数に対して直接演算は出来ませんが、幸いにして Convert.XXX が使えるようです。
    そこで int, float, double, string にも対応できるように、Double に変換してから計算してみました。
    演算結果は string に変換してリターンしています。
    generics の説明は generics の基礎 を参照して下さい。
        public static string TestGeneric<T>(T n1, T n2)
        {
            return Convert.ToString((Convert.ToDouble(n1) + Convert.ToDouble(n2)));
        }
       

超初心者のプログラム入門(C# Frame Work)