Tsuの雑記¯\_(ツ)_/¯

主に製作メモ・備忘録として使用。製作したアプリのリンクもあります。

【C#】Action<in T> の in とは【デリゲート】

C# における Action<in T> の in キーワードについて,調べてみました。


始めに

「Action<in T> in とは」という検索ワードによる当ブログへのアクセスがあったため,記事にします。


Action<in T> とは

そもそも「Action<in T>」という記述は,どこにあるのか。

まずは,適当なIDEでSystem.Action<T>を宣言してみましょう。

IDE で Action&lt;T&gt; を宣言した画像
Action<T> の宣言

Visual Studio の機能であるヒントが表示されていますが,その中に「Action<in T>」と書かれていますね。

次は,マイクロソフトの公式ドキュメントです。

docs.microsoft.com

タイトルには「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にも代入できます。

この機能が反変であり,stringobjectの派生型であるから可能なんですね。

inキーワードと反変については,下記のページに詳しく書かれています。

docs.microsoft.com


終わりに

今回の話をまとめます。

  • System.Action<T>の実態はdelegate void Action<in T>(T obj)というデリゲートである

  • inキーワードの反変によってTに当たる型の派生型に暗黙的変換が出来る

以上,Action<in T>inについてでした。