ホームページ >バックエンド開発 >C++ >C# でコンストラクターの引数を汎用 `new()` 制約に渡すにはどうすればよいですか?

C# でコンストラクターの引数を汎用 `new()` 制約に渡すにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-22 13:36:14231ブラウズ

How Can I Pass Constructor Arguments to a Generic `new()` Constraint in C#?

C# でテンプレート型のジェネリックスを渡す new() コンストラクター パラメーター

質問:

new() 制約を使用するジェネリック メソッドでコンストラクター引数を持つ型 T の新しいオブジェクトを作成しようとすると、コンパイル エラーが発生します。エラー メッセージには、オブジェクトの初期化中にパラメータを指定できないことが示されています。

<code class="language-csharp">public static string GetAllItems<T>(...) where T : new()
{
   List<T> tabListItems = new List<T>();
   foreach (ListItem listItem in listCollection) 
   {
       tabListItems.Add(new T(listItem)); // 此处出错。
   } 
   ...
}</code>

解決策:

コンストラクター引数を使用してジェネリック型のオブジェクトを作成するには、new 制約を使用するだけでは十分ではありません。必要なパラメータを使用して初期化を処理するには、カスタム関数を導入する必要があります。その方法は次のとおりです:

<code class="language-csharp">public static string GetAllItems<T>(..., Func<ListItem, T> del)
{
  ...
  List<T> tabListItems = new List<T>();
  foreach (ListItem listItem in listCollection) 
  {
    tabListItems.Add(del(listItem)); // 使用函数创建对象。
  }
  ...
}</code>

カスタム関数を使用すると、次のように汎用メソッドを呼び出し、型を指定して初期化関数を提供できます。

<code class="language-csharp">GetAllItems<Foo>(..., l => new Foo(l));</code>

以上がC# でコンストラクターの引数を汎用 `new()` 制約に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。