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



我正在创建一个帮助程序来过滤流/可观察对象中的特定类型的对象。这是要点:

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));

对于上面标记的行,将引发以下异常:

无效强制转换

异常:指定的强制转换无效。

我尝试过为IGameAction和实现器中的任何一个和两个使用类(例如。OpenDoorAction)。我不明白为什么我需要强制转换来IObservable<T>,但是没有它,编译器说没有从IObservable<IGameAction>IObservable<T>的隐式强制转换。Subject实现IObservable.

FWIW 这是使用 UniRx 的 Unity3D

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

相反,您应该重新转换流中的各个项目:

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

然后,您的返回值将是正确的类型的 IObservable。


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

相关内容

  • 没有找到相关文章

最新更新