要するに、タイプパラメータ(T
)がstring
またはint[]
に制限されている汎用メソッドを定義できますか?擬似C#では、私は何をしたいです:ジェネリック型パラメータをStringまたはArrayに制限することは可能ですか
public static int MyMethod<T> (T arg1, T arg2)
where T : (has an indexer that returns an int) {
// stuff with arg1[i], arg2[j], etc...
}
なお、C#で、原因に内蔵されたint
、次の式にchar
からの暗黙的な変換と一緒に(char
を返す)string
インデクサsource
がstring
かint[]
であるかを正確に同じことを意味します
int someval = source[index];
私はちょうどに関連付けられていないタイプのリストを作ることができない実現します制約条項。 int[]
とstring
は両方ともT: IEnumerable<int>
に従いますが、IEnumerable<T>
では、実装者がインデクサーを必要としません。これは、両方のタイプから使用している共通の機能です。
これは、Damerau-Levenshtein距離アルゴリズムを高速に実装するなど、高度に最適化された文字列解析と解析機能を構築することを目的としています。私の文字列をintの配列に変換すると、(D-Lアルゴリズムのように)文字単位の処理が繰り返し実行される場合があります。これは主に、int
の値を比較すると、char
の値よりもはるかに高速です。
有効な単語は「時々」です。ストリング上で直接操作し、最初に変換してint
の配列にコピーするコストを回避する方が速い場合もあります。だから私は宣言を除いて真に同じメソッドを持っています。
もちろん、私はdynamic
を使うことができますが、ランタイムチェックによるパフォーマンスの低下は、そのメソッドの構築で得られた利益を完全に破壊します。 (I はをテストしました)。
であなたはそれのための小さなラッパークラスを記述する必要がありますので、
残念ながら、
string
は、IList<char>
を実装していません。 'T 'を静的に*どちらか一方の型として扱うのは理にかなっていますか?制約のポイントは、 'T'型の変数を操作して最小限の型互換性を期待できるようにすることです。相互に互換性のない2つの型に制約することは奇妙です。 –@ kirk-woll:私が詳しく説明しているように、それらは私の目的のために相互に互換性がありません。それどころか、彼らは同じです。私は、あるバージョンのパラメータが 'string'として宣言され、他のバージョンで' int [] 'として宣言されていることを除いて、100%同一のメソッドを構築しています。どちらの場合も、コレクションの各メンバーを整数として操作しています。 –
いいえ 'string'と'(任意の) 'Array'が' object'で統一されています。文字列から 'char []' *を作成することはできますが、文字列はC#の 'char []'それは、コピーされた内容を持つ* new *配列オブジェクトです。 –