IObservable 的无效转换,运行时异常

Invalid cast of IObservable, runtime exception

我正在创建一个助手来过滤 stream/observable 中特定类型的对象。这是要点:

public interface IGameAction { }

// Example action
public struct OpenDoorAction : IGameAction { }

// In Store.cs
public Subject<IGameAction> Actions;

public IObservable<T> When<T>() where T : IGameAction
{
    // Exception here
    return (IObservable<T>)this.Actions.Where(action => action is T);
}

像这样使用时:

this.When<OpenDoorAction>()
    .Subscribe(a => Debug.Log(a));

上面标记的行抛出以下异常:

InvalidCastException: Specified cast is not valid.

我已经尝试对 IGameAction 和实现者(例如 OpenDoorAction)中的任何一个和两者都使用 类。我不明白为什么我需要转换为 IObservable<T>,但如果没有它,编译器会说没有从 IObservable<IGameAction>IObservable<T> 的隐式转换。 Subject 实施 IObservable.

FWIW 这是在 Unity3D 中使用 UniRx

这是因为 IObservable<IGameAction>IObservable<T> 之间没有直接转换,即使您指定了约束。

您应该重新投射流中的各个项目:

return this.Actions.Where(action => action is T).Cast<T>();

然后您的 return 值将成为正确类型的 IObservable。


正如 mjwills 在评论中指出的那样,存在 IObservable<T>.OfType<T2> 的辅助函数,它基本上只是为您执行 where 和 cast。