2016-06-21 19 views
2

C#では、ジェネリックメソッドを作成し、特定のタイプの具体的な実装を追加することは可能ですか? 例:具体的な実装のジェネリック

void Foo<T>(T value) { 
    //add generic implementation 
} 
void Foo<int>(int value) { 
    //add implementation specific to int type 
} 
+0

私は」私の答えを落としました。あなたが尋ねていることがはっきりしていないので、私も投票に投票しました。それは[XY問題](http://xyproblem.info/)のように思えます。 –

答えて

5

一般的に、これはできません。その代わりに、汎用的でないオーバーロードを実装するのは、コンパイラがそれを汎用バージョンに使用する方が望ましいからです。コンパイル時の型は、オブジェクトをディスパッチするために使用されます。

void Foo<T>(T value) 
{ 
} 

void Foo(int value) 
{ 
    // Will get preferred by the compiler when doing Foo(42) 
} 

しかし、一般的なケースには、これは常に動作しません。継承などで混在すると、予期しない結果が生じることがあります。たとえば、IBar実装Barクラスならば持っていた:

void Foo<T>(T value) {} 
void Foo(Bar value) {} 

をそして、あなたは経由で呼ばれる:あなたは、動的ディスパッチを経由して、この問題を回避することができます

IBar b = new Bar(); 
Foo(b); // Calls Foo<T>, since the type is IBar, not Bar 

public void Foo(dynamic value) 
{ 
    // Dynamically dispatches to the right overload 
    FooImpl(value); 
} 

private void FooImpl<T>(T value) 
{ 
} 
private void FooImpl(Bar value) 
{ 
} 
+0

明確な説明をいただきありがとうございます。 –

+0

良い答え、Reed。 –

関連する問題