OK、これは知的な質問のようです。
C# コンパイラの観点から、IObservable メソッド シグネチャの場合、提案しているものは次のようになります (T = Exception を考慮して):
public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onNext);
public static IDisposable Subscribe<T>(this IObservable<T> source, Action<T> onError);
どちらのメソッドのオーバーロードも同じシグネチャを持ち、コンパイラではサポートされていません。
インターフェイスの観点からは、IObserver は次のように定義されています。
public interface IObserver<in T>
{
void OnCompleted();
void OnError(Exception error);
void OnNext(T value);
}
インターフェイスの実装者は次のようにする必要があります。
public class Observer<T> : IObserver<T>
{
public void OnCompleted()
{
}
public void OnError(Exception error)
{
// Do something with exception
}
public void OnNext(T value)
{
}
}
したがって、OnNext = () => {} を指定しなくても、基盤となるインフラストラクチャで実装する必要があります。それを指定してパフォーマンスを失うことはありません。
オブザーバー パターンの論理的な観点から、あなたの意図は要素/イベントのシーケンスに非同期的にサブスクライブすることです。OnNext 関数を省略して OnError のみを残すメソッド シグネチャは、Rx ライブラリのユーザーにとって誤解を招く可能性があります。OnNext で何もしたくないという意図を明示的に述べると、より明確になります。
OnCompleted または OnError メソッドが受信されると、Rx 文法により、サブスクリプションが終了したと見なされることが保証されます。
あなたがやろうとしていることは、空の foreach ループを作成して例外を待つことと同じです:
try
{
foreach (var e in sequence)
{
// do nothing
}
}
catch (Exception ex)
{
// Do something
}
これは一般的なシナリオではありません。