C#: ValueObjectでswitch式を使う

AIで生成したC#プログラミングのイメージ

※アイキャッチ画像は、話題の生成AIで作成してみました。

public record UserType
{
   public static readonly UserType NormalUser = new(0);
  public static readonly UserType PremiumUser = new(1);

private UserType (byte value ) => Value = value;

public byte Value {get;}

public static UserType Parse(byte value) =>
value switch
{
0 => new UserType(value),
1 => new UserType(value)
_ => // throw Exception
};

例えばこんなValueObjectがあるとしたとき、これは定数として定義されていないので普通通りやるとswitch式の条件に使うことができない。

public string hogehoge()
{
  UserType t = repository.FindUserType();
  return t switch {
  UserType.NormalUser => "無料会員",
  UserType.PremiumUser => "プレミアム会員",
  _ => "会員ではない"
};

「ValueObjectなので、定数っぽく使ってswitchに載せたい」というのが書き手の意図なわけだけれども、C#の文法上これは許されていなくて、この書き方ではコンパイルエラーになってしまう。

そこで、最近のC#に導入されている型のパターンマッチングと組み合わせて、not null when~を使うとそれっぽく書くことができる。

return t switch
{
  not null when t == UserType.NormalUser => "無料会員",
  not null when t == UserType.PremiumUser => "プレミアム会員",
  _ => "会員ではない"
};

項目が増えるとnot nullの羅列になるので、ここのところはシンタックスシュガー的なアシストが欲しいなと思う今日このごろ。(あるいは、もっと良い書き方を知りたい)