MRが楽しい

MRやVRについて学習したことを書き残す

C#で型テスト演算子を使って条件分岐で型チェックとキャストを同時に行う

本日はC#の小ネタ枠です。
C#で型テスト演算子を使って条件分岐で型チェックとキャストを同時に行う方法です。

型テスト演算子

is または as 演算子を使って指定された型と互換性があるかの確認または変換を行うことができます。
is 演算子を使用すると式の結果も出力されるため、条件分岐で型チェックとキャストを同時に行うことも可能です。
C# 7.0以降のバージョンで利用可能です。
learn.microsoft.com

if(a is int b)
{
    c = b++;
}

サンプルスクリプト

以下のif文とswitch文の条件分岐で型チェックとキャストを同時に行うサンプルスクリプトを作成しました。
・TypeTest.cs

/// <summary>
/// エラー型を同じIErrorインターフェースで表現する
/// </summary>
/// <summary>
/// エラー型を同じIErrorインターフェースで表現する
/// </summary>
public interface IError
{
    // 通常のエラーには付属情報を付けない
    public sealed class KnownError : IError{}

    // 未知のエラーにはメッセージを付ける
    public sealed class UnknownError : IError
    {
        public string Message { get; }
        
        public UnknownError(string message)
        {
            Message = message;
        }
    }
}

public class TypeTest : MonoBehaviour
{
    void Start()
    {
        IError error = new IError.UnknownError("Unknown Error");
        
        IfTypeTest(error);
        SwitchTypeTest(error);
    }

    private void IfTypeTest(IError error)
    {
        // if文で型を判定する
        if (error is IError.UnknownError unknownError)
        {
            // キャストしなくてもプロパティにアクセスできる
            Debug.Log($"if result : {error.GetType()} {unknownError.Message}");
        }
        else
        {
            Debug.Log($"if result : {error.GetType()}");
        }
    }
    
    private void SwitchTypeTest(IError error)
    {
        string logMessage = error switch
        {
            // switch文でも型を判定しながらキャストできる
            IError.UnknownError unknownError => $"{error.GetType()} {unknownError.Message}",
            _ => $"{error.GetType()}"
        };
        Debug.Log($"switch result : {logMessage}");
    }
}

実行結果は以下の通りです。条件分岐で型チェックとキャストを同時に行うことができました。

if result : IError+UnknownError Unknown Error
switch result : IError+UnknownError Unknown Error