class Poly
{
public static void WriteVal(int i) { System.Console.Write("{0}\n", i); }
public static void WriteVal(string s) { System.Console.Write("{0}\n", s); }
}
class GenWriter<T>
{
public static void Write(T x) { Poly.WriteVal(x); }
}
なぜ無邪気な(C++プログラマー向け)メソッドの書き込みはC#で受け入れられないのですか?多態性、オーバーロード、ジェネリックC#
あなたはコンパイラがインスタンス化する前に、具体的な過負荷にパラメータ型Tを一致させようとしていることがわかります。
エラー3「TestGenericPolyMorph.Poly.WriteVal(int型)」の最良のオーバーロードされたメソッドが一致しているいくつかの無効な引数
もちろんです。上記のように静的メソッドを使用するのではなく、多態的な振る舞いを持つラッパーを作成することを目的としています。 注:VS 2010を使用しています。
コンパイル時に必要な情報はすべて入手できます。もう一度、問題は、検証がテンプレートのインスタンス化の前に実行されることです。議論の後
追加:
まあ、私はこれを適切にストレスがたまっていないかもしれません。 問題はジェネリックとテンプレートの違いだけでなく、さまざまな型を扱うオーバーロードのセットがあるので、これらの型の仮想メソッド(多態性)を提供するラッパークラスのセットを生成したいと考えています。 実行時の仮想メソッドの解決の価格は最小であり、パフォーマンスには影響しません。これはC++テンプレートが便利な場所です。明らかに、動的の実行時の型のオーバーヘッドは全く異なります。 したがって、既存のオーバーロードを多態性に変換し、コードを複製せずにパフォーマンスのペナルティを払うことができないかどうかが問題です(例えば、ダイナミックと比較して、構文)。
私がこれまで見てきた解決策の1つは、自動的にこれを行うためにカットアンドペーストの代わりにコードを生成/発行することでした。
C++テンプレート処理の代わりに、手動で行うか、マクロ/テンプレートプロセッサを再作成するだけです。
いいですか?
"問題は、検証がテンプレートのインスタンス化の前に実行されることです。" - はい、そうです。コンパイラはコンパイル時にxの型が分からないので、C#ではこれを行うことはできません。 – TheBoyan
[C#とJavaのジェネリックスとC++のテンプレートの違いは何ですか?](http://stackoverflow.com/questions/31693/what-are-the-differences-between-generics-in -c-sharp-and-java-and-templates-i) –