kazuakix の日記

Windows Phone とか好きです

ReactiveCommand で Subscribe しようとして謎のエラーに悩まされていた話

ずいぶん長いことプログラムを書いてなかったのでリハビリを兼ねて作りかけだった某クーポンアプリに着手しました。
数か月前にデータの取得部分だけ作って画面が手つかずという酷い状態だったので、新しくプロジェクトを作って心機一転、せっかくなので Prism + Reactive Property 構成で行ってみます。

Prism + Reactive Property については id:okazuki さんのページを参照してください。
特に後者の資料がお勧めです。

とりあえず UI だけでも...という事で ViewModel 作って メイン画面から設定画面に遷移するコマンドだけ作ってみました。

public class MainPageViewModel : ViewModel
{
    private readonly INavigationService navigationService;

    public ReactiveCommand NavigateToSettingsPageCommand { get; private set; }

    public MainPageViewModel(INavigationService navigationService)
    {
        this.navigationService = navigationService;

        this.NavigateToSettingsPageCommand = new ReactiveCommand();
        this.NavigateToSettingsPageCommand.Subscribe(_ => this.NavigateToSettingsPage());
    }

    // 設定ページに移動するだけ
    private void NavigateToSettingsPage()
    {
        this.navigationService.Navigate("Settings", null);
    }
}

ところがここで予想外のエラー

f:id:kazuakix:20150628225653j:plain

"Argument type 'lambda expression' is not assignable to parameter tyoe 'System.IObserver'" だそうです。

しばらく悩んでいたのですが、まったくわからなかったので 日曜の夜に床の上で寝ていたという かずきさんに質問の Skype を送ってみました。冷たくなる前に起こせてよかったです。
 
エラーの状況をスクリーンショットで送ります。*1

f:id:kazuakix:20150628225826j:plain
即答かよ!

この間 10 秒足らず...
しかも using System; 足すだけで 何事もなかったようにエラー消えてるし。

f:id:kazuakix:20150628232413j:plain

この後 解説してもらったところによると、ラムダを受け取る Subscribe の拡張メソッドは System 名前空間で定義されているんだそうです。

一応 言い訳しておくと、最初にクラスを作ったときに R# 先生の力で景気よく using 句 整理したのが原因でした。なんでもかんでも消すのも考え物ですね。

*1:余談ですが Skype にスクリーンショットを貼り付けできる機能 すごく便利ですよね。