-1

重複の可能性:
.NET ジェネリックでオーバーロードされた演算子制約の解決策 ジェネリック
で算術を実装していますか?

Generics クラスを作成しましたが、タイトルに記載されている問題が発生しています。

class Program
    {
        static void Main(string[] args)
        {
            int a = 1;
            int b = 2;
            int c = 3;

            dynamic obj = new Gen<int>();
            obj.TestLine1(ref a, ref b);
            obj = new Gen<string>();
            obj.TestLine2(ref a, ref b, ref c);
            System.Console.WriteLine(a + " " + b);
            Console.ReadLine();
        }
    }

public class Gen<T>
    {
        public void TestLine1(ref T a, ref T b)
        {
            T temp;
            temp = a;
            a = b;
            b = temp;
        }
        public void TestLine2(ref T a, ref T b, ref T c)
        {
            T temp;
            temp = a;
            a = a + b;
            b = a + c;
            c = a + b;
        }
    }

メソッドTestLine2(ref T a、ref T b、ref T c)の内部で、以下の問題が発生しています:

Operator '+' cannot be applied to operands of type 'T' and 'T'
4

4 に答える 4

7

T任意の型になる可能性があるため、静的演算子があるという保証はありませT+TC# では、 のような静的演算子をサポートするように制約する方法がないため、 to+の値を結合するために使用する関数を渡す必要があります。TTestLine2

public void TestLine2(ref T a, ref T b, ref T c, Func<T, T, T> op)
{
    T temp;
    temp = a;
    a = op(a, b);
    b = op(a, c);
    c = op(a, b);
}
于 2013-02-02T19:21:29.930 に答える
1

T+ 演算子を実装しているかどうかはわかりません。object型パラメータとして渡すとどうなりますか?

于 2013-02-02T19:31:53.060 に答える
0

T の型はインスタンス化されるまでわからないため、型 T が + 演算子をサポートするという保証はありません。

于 2013-02-02T19:21:14.623 に答える
0

次のようなクラスのインスタンスを作成したとしますvar gen = new Gen<Object>()。Nowは、クラスのこのインスタンス内のすべての場所をT意味します。Objectを呼び出すTestLine2()と、メソッドはオブジェクトに追加しようとしますが、これは C# では実行できません。

もっと大まかに言うと、C# はGenオブジェクトを作成する際に使用する型引数を事前に認識していないため、すべてのオブジェクトに対して定義されたメソッドのみを使用するように制限されます。

TestLine2あなたは本当に文字列を構成する方法になりたいようです。Gen非ジェネリック クラスを作成し、String代わりにどこでも sを使用するように指示してみませんか?

于 2013-02-02T19:31:27.147 に答える