好的,这似乎是一个知识性问题,因此:
从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)
{
}
public void OnNext(T value)
{
}
}
因此,即使您不指定OnNext =()=> {},基础架构也必须实现它。 指定它不会使性能下降。
从观察者模式的逻辑角度来看,您的意图是异步订阅元素/事件序列。省略OnNext函数仅保留OnError的方法签名将误导Rx库的用户。如果您明确声明您不想在OnNext上执行任何操作,则更加清晰。
引用:一旦收到OnCompleted或OnError方法,Rx语法保证可以认为订阅已完成。
您尝试的操作相当于创建一个空的foreach循环并等待异常:
try
{
foreach (var e in sequence)
{
}
}
catch (Exception ex)
{
}
这并不是常见的情况。