1

「動的」を使用することが、ジェネリック型内からオーバーロードを使用する唯一の方法であるかどうか疑問に思います。(int)(object) プレフィックスは少し扱いに​​くいです。

public class TOfTestCase<T> {
    public void otherMethod(int arg1) {

    }

    public void method(T arg1) {
        if (typeof(T) == typeof(int)) {
            otherMethod((int)(object)arg1);
        }
    }
}
4

3 に答える 3

2

はい、そうです。C# コンパイラを効果的に騙して、より意味のある変換を探さないようにする必要があります。

個人的に、メソッドが特定の型しか処理できない場合は、最初からジェネリックにするよりもオーバーロードを使用する方が良いと思いますが、状況によって異なります。

本当にオーバーロードを実行しようとしている場合(各名前のメソッドが 1 つしかないため、サンプル コードにオーバーロードは示されていません)、C# 4 を使用している場合は、動的型付けを使用できます。

public class SampleClass<T> {
    public void OtherMethod(int arg) {}
    public void OtherMethod(string arg) {}
    public void OtherMethod(DateTime arg) {} 

    public void Method(T arg) {
        dynamic d = arg;
        OtherMethod(d);
    }
}

もちろん、適切なオーバーロードがない場合、これは実行時に失敗します。

于 2012-11-05T07:19:05.757 に答える
1

実際、ボックス化/ボックス化解除を完全に回避できます...

public class TOfTestCase<T> {
    public void otherMethod(int arg1) {

    }

    public void method(T arg1) {
        if (typeof(T) == typeof(int)) {
            otherMethod(__refvalue(__makeref(arg1), int));
        }
    }
}

... これらのキーワードを使用しても構わない場合。=P

于 2012-11-05T07:34:54.557 に答える
0

これは、ジェネリックが必要な場合のオプションになる可能性があります。それ以外の場合は、オーバーロードがよりクリーンであるというジョンに同意します。

public void method<T>(T arg1) where T : IConvertible
{
    OtherMethod(arg1.ToInt32(CultureInfo.InvariantCulture));
}

あなたの場合、クラスの制約またはこのメソッドの T1 が必要です。1.2 のような double を渡すと、データが失われるリスクがあることに注意してください。

于 2012-11-05T07:26:50.593 に答える