【C#】Action<in T> の in とは【デリゲート】
C# における Action<in T> の in キーワードについて,調べてみました。
始めに
「Action<in T> in とは」という検索ワードによる当ブログへのアクセスがあったため,記事にします。
Action<in T> とは
そもそも「Action<in T>」という記述は,どこにあるのか。
まずは,適当なIDEでSystem.Action<T>を宣言してみましょう。

Visual Studio の機能であるヒントが表示されていますが,その中に「Action<in T>」と書かれていますね。
次は,マイクロソフトの公式ドキュメントです。
タイトルには「Action<T>」と書かれていますが,少し読み進めてみましょう。
public delegate void Action<in T>(T obj);
先程IDEのヒントに表示された物と,一致していますね。
つまり,我々が普段使用しているSystem.Action<T>の実態はdelegate void Action<in T>(T obj)というデリゲートなのです。
<in T> とは
それでは,この<in T>はなにを意味するのか。
先程の公式ドキュメントを,更に読み進めましょう。
型パラメーター T
このデリゲートによってカプセル化されるメソッドのパラメーターの型。 この型パラメーターは反変です。 つまり、指定した型、または弱い派生型のいずれかを使用することができます。
これを,スクリプトに例示します。
// Action 使用のため using System; public class NewScript { // action に指定した型パラメータは object Action<object> action; void A() { // 指定した型 Action<object> action2 = action; // 弱い派生型(object → string) Action<string> action3 = action; } }
action宣言時の型はAction<object>ですが,同じくAction<object>型のaction2にもAction<string>型のaction3にも代入できます。
この機能が反変であり,stringがobjectの派生型であるから可能なんですね。
inキーワードと反変については,下記のページに詳しく書かれています。
終わりに
今回の話をまとめます。
System.Action<T>の実態はdelegate void Action<in T>(T obj)というデリゲートであるinキーワードの反変によってTに当たる型の派生型に暗黙的変換が出来る
以上,Action<in T>のinについてでした。