C#では、ジェネリックメソッドを作成し、特定のタイプの具体的な実装を追加することは可能ですか? 例:具体的な実装のジェネリック
void Foo<T>(T value) {
//add generic implementation
}
void Foo<int>(int value) {
//add implementation specific to int type
}
C#では、ジェネリックメソッドを作成し、特定のタイプの具体的な実装を追加することは可能ですか? 例:具体的な実装のジェネリック
void Foo<T>(T value) {
//add generic implementation
}
void Foo<int>(int value) {
//add implementation specific to int type
}
一般的に、これはできません。その代わりに、汎用的でないオーバーロードを実装するのは、コンパイラがそれを汎用バージョンに使用する方が望ましいからです。コンパイル時の型は、オブジェクトをディスパッチするために使用されます。
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)
{
}
明確な説明をいただきありがとうございます。 –
良い答え、Reed。 –
私は」私の答えを落としました。あなたが尋ねていることがはっきりしていないので、私も投票に投票しました。それは[XY問題](http://xyproblem.info/)のように思えます。 –