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

时间:2017-12-17 20:00:00

标签: c# generics casting system.reactive unirx

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

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:指定的强制转换无效。

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

FWIW使用UniRx

在Unity3D中

1 个答案:

答案 0 :(得分:4)

这是因为即使您已指定约束,IObservable<IGameAction>IObservable<T>之间也没有直接投射。

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

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

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

正如mjwills在评论中指出的那样,IObservable<T>.OfType<T2>的帮助函数存在,它基本上就是为你做的地方和演员。