ひでぼ~blog

C#ときどきゲーム

explicit演算子を試した

C#でexplicitというキーワードを使うと()を使った明示的なキャストを定義できることを知ったので試してみました。

class Program {
    static void Main(string[] args) {
        var book = new Book {
            Id = 1,
            Name = "はじめてのC#",
            Price = 1200
        };

        var bookViewModel = (BookViewModel)book;

        Console.WriteLine(bookViewModel.Price);
    }
}

BookからBookViewModelへキャストしています。クラスの定義はこんな感じです。BookのPriceの型がBookViewModelではintからstringになっているのがポイントです。

class Book {

    public static explicit operator BookViewModel(Book book)
        => new BookViewModel { Id = book.Id, Name = book.Name, Price = book.Price.ToString("#,0") + "円" };

    public int Id { get; set; }

    public string Name { get; set; }

    public int Price { get; set; }
}

class BookViewModel {

    public int Id { get; set; }

    public string Name { get; set; }

    public string Price { get; set; }
}

BookViewModelではPriceを"X,XXX 円"と表示するようにフォーマットしています。 実行結果を確認するとちゃんとBookViewModelにキャストされ、Priceの値もフォーマットされていました。

1,200円

ちなみに公式ドキュメントを読んでみるとas, is演算子でキャストした場合は対応していないようです。

コードを書いてて気づいたのですが、ModelからViewModelを参照しちゃっててダメですね。Model <=> VIewModelのキャストにはあまり使えないかもしれません。

参考サイト

ユーザー定義の変換演算子 - C# リファレンス | Microsoft Docs