Observable.AsObservable<TSource>

Observable.AsObservable<TSource>で、IObservable<TSource>にキャストできる。

Observable.AsObservable(TSource) Method (System.Reactive.Linq) | Microsoft Docs
Reactive Extensions再入門 その3「IObservableのファクトリメソッド」 - かずきのBlog@hatena
【Unity】AsObservable()メソッドについて【UniRx】 - Qiita

Subject<T>は、IObservable<T>を実装しているので、これでキャストする必要ないように感じるかもしれないが、これはSubject<T>に戻されたくない場合に使う。

普通のキャストなら元に戻せるので、

x = 1
x = 2
Complete.
続行するには何かキーを押してください . . .

こうなるが、AsObservableを使うと、

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Observable_
{
    class Program
    {
        // メインメソッド
        static void Main(string[] args)
        {
            // Subjectの生成.
            Subject<int> subject = new Subject<int>();  // int型のSubjectオブジェクトsubjectを生成.

            // 登録.
            subject.Subscribe(x => Console.WriteLine("x = " + x), ex => Console.WriteLine("ex.Message" + ex.Message), () => Console.WriteLine("Complete."));    // 値の通知, エラー処理, 完了通知をセット.

            // 発行.
            subject.OnNext(1);  // 1を発行.

            // IObservable<int>にキャスト.
            IObservable<int> observable = subject.AsObservable();   // Object.AsObservableでSubect<int>からIObservable<int>にキャスト.

            // 元に戻す.
            Subject<int> subject2 = (Subject<int>)observable;   // IObservable<int>からSubect<int>にキャスト.

            // subject2で発行.
            subject2.OnNext(2);  // 2を発行.

            // 完了.
            subject.OnCompleted();  // 完了を通知.

            // 解除.
            subject.Dispose();  // 解除.
        }
    }
}

とした時に、

x = 1

ハンドルされていない例外: System.InvalidCastException: 型 'System.Reactive.Linq.ObservableImpl.AsObservable`1[System.Int32]' のオブジェクトを型 'System.Reactive.Subjects.Subject`1[System.Int32]' にキャストできません。
   場所 Observable_.Program.Main(String[] args) 場所 C:\Project\Cloud\github.com\Sample\rx\Observable\AsObservable_TSource\src\Observable_\Observable_\Program.cs:行 30
続行するには何かキーを押してください . . .

キャストできないという例外が出る。
このようにダウンキャストして欲しくない時に使う。

Sample/rx/Observable/AsObservable_TSource/src/Observable_ at master · bg1bgst333/Sample · GitHub