69

Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TResult>今日、C#.NET4.5で美しいデリゲートに出くわしました。16は停止する任意の場所だと思いますが(16を超えるパラメーターを持つメソッドはどれですか?)、C#でジェネリック型が任意の数の型引数を持つことができると指定することは可能ですか?メソッドのparamsキーワードで、メソッドの引数をいくつでも使用できるのと同様の方法です。このようなもの:

public class MyInfiniteGenericType<params T[]> { ... }

クラス内では、型引数を列挙するか、メソッド内で許可T[index]されるのと同じ方法で使用することにより、型引数にアクセスparamsできます。

私はこれを個人的に使用したことはありませんが、Funcデリゲートはこれを使用するのに最適な場所です。16種類のFuncは必要ありません!

だから私の質問は、これはC#でどのようにでも行うことができますか?そうでない場合、これはばかげた考えですか?

4

7 に答える 7

58

ジェネリック型が任意の数の型引数を持つことができることをC#で指定することは可能ですか?

いいえ、C# にはそのようなものはありません。

CLR に関する限り、基本的Func<T>に とはまったく無関係な型であり、複数の型引数を指定するようなものはありません。Func<T1, T2>params

その有用性については、有用なケースが見られますが、機能が「利益/コスト」のしきい値を超えないことを意味するほどまれであると思われます. (ほぼ確実に CLR の変更も必要になることに注意してください。)

于 2013-03-14T18:22:18.277 に答える
13

C++11 には、本質的に話している機能があります。彼らはそれをvariadic templatesと呼んでいます。

ただし、C# ジェネリックは C++ テンプレートとはまったく異なり、まったく同じものを構築することは困難です。

C++ の場合、テンプレートはコンパイル時に、使用される具象型に展開されます。C# の場合、型指定は完全に実行時に行われます。結果として得られる IL は、遭遇するさまざまなタイプの数をサポートする必要があります。

于 2013-03-14T18:25:09.627 に答える
1

いいえ、これはできません。

それを型の配列として扱うほど単純ではありません (C# には存在しない概念です)。考慮してください - 型パラメーターの数は、デリゲートのメソッドFuncのパラメーターの数と同じでなければなりません。Invokeしかし、プログラマーは、型パラメーターと通常のパラメーターの間のそのような関係をどのように表現するのでしょうか?

ただし、この機能は C++11 -可変個引数テンプレートに存在します。C++ では、配列構文を使用して個々の型パラメーターにアクセスできないことに注意してください。代わりに、関数は通常、最初の型パラメーターを残りの型パラメーターから分離し、再帰呼び出しを使用して残りをアンパックします。

于 2013-03-14T18:26:08.940 に答える
0

いいえ、任意の数のジェネリック引数を持つことはできません。ジェネリック型パラメーターは実行時に解決されず、コンパイル時に解決されるため、それはおそらくばかげた考えでもあります。

また、Tuple<,,,,,,,,> がわかりやすい場所かもしれないと思うかもしれませんが、一般的な引数を使い果たした場合の解決策は、最後の引数を Tuple<,,,,> にすることです。残りのフィールド。

于 2013-03-14T18:22:37.837 に答える
0

これが役立つかどうかはわかりませんが、回避策は次のとおりです。

Func<List<object>>

各要素をそれぞれのデータ型に手動で変換する必要があります。これを繰り返し使用できます。

 Convert.ChangeType(obj, obj.GetType())//using System;

そして、必要な変数のセットを持つことができます。

于 2021-10-07T10:06:18.630 に答える