1
public static object GetObject(int x)
{
    return new object { };
}
public static object GetObject(string x)
{
    return new object { };
}
public static void ProcessObject<T>(T x) where T : int, string <= got error here: 
{
    object o = GetObject(x);
}

エラーが発生しました「制約として使用される型は、インターフェイス、非シールクラス、または型パラメータである必要があります。」

ProcessObject(int x)コードを書き直して、書き込みなしで2回動作させるにはどうすればよいProcessObject(string x)ですか?

4

5 に答える 5

3

だからあなたが今持っているものは(受け入れられた答えとあなたのコメントによると):

public static void ProcessObject<T>(T x)
{
    object o;
    if (typeof(T) == typeof(int))
        o = GetObject((int)(object)x);
    else if (typeof(T) == typeof(string))
        o = GetObject((string)(object)x);
    else
        throw new Exception();
    // do stuff with o
}

publicintstringoverloadを作成することをお勧めしますが、コードの重複を防ぐために、内部で別のメソッドを呼び出します。

public static void ProcessObject(int x)
{
    ProcessObject(GetObject(x));
}
public static void ProcessObject(string x)
{
    ProcessObject(GetObject(x));
}
private static void ProcessObject(object o)
{
    // do stuff with o
}

これにより、publicメソッドの入力値が明確になります。実際のロジックを複製することなく、受け入れ可能なタイプはとだけです(int)。string// do stuff with o

ProcessObject2つのパブリックメソッドが互いに重複していることを嫌うかもしれませんが(とにかく表面的には、2つの異なるGetObjectオーバーロードを呼び出しています)、それが最良のオプションだと思います。

于 2012-08-04T12:28:34.247 に答える
2

やろうとしていることを行うことはできません。まず、一般的な制約に複数のクラスをリストすることはできません。次に、制約に入れることができるタイプは、それを継承できる(またはインターフェースの場合は実装できる)ようなものでなければなりません。両方ともintstringこのチェックに失敗します。このような場合は、2つの別々のオーバーロードを使用する方がよいでしょう。

于 2012-08-04T12:00:07.730 に答える
1

whereパーツを外すだけ

public static void ProcessObject<T>(T x) 
{
    object o = GetObject(x);
}

またobject、他の方法では使用せず、代わりに使用してくださいT

于 2012-08-04T11:59:53.470 に答える
1

C#では、型パラメーターの制約を確認することはできません。動的に使用してみてください

于 2012-08-04T12:04:44.170 に答える
1

一般的に言って、ジェネリック型の引数に基づいてオブジェクトの反応が異なる場合は、この場合、ジェネリックを使用するべきではありません。ジェネリックスは、実際に使用されているタイプに関係なく、常に同じことを実行したい状況に最適です。

したがって、ジェネリック制約では、型引数に対して1つの基本クラスのみをリストできます。それぞれの型引数に渡される実際の型は、指定した基本クラスから始まる特定の継承階層の一部であることが意図されているため、クラスのユーザーは、基本クラスまたはそのサブクラスのいずれかに一致する任意の型を指定できます。

同時に、ジェネリッククラスの作成者であるあなたは、指定された型が(少なくとも)制約によって示される基本クラスのインターフェースを持っていると安全に想定できます。したがって、基本クラスの任意のメンバーにアクセスできます。

stringまたはを許可したい場合はint、どのメンバーになることができるか想像してみてください。どちらもから直接派生しているSystem.Objectため、制限がないため、制限は意味がありません。すべてのタイプはから派生しSystem.Objectます。

string要約すると、本当に別の方法で処理したい場合int、これは1つのジェネリッククラスではなく2つのオーバーロードを提供する場合に間違いなく当てはまります。

于 2012-08-04T12:14:28.150 に答える