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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无效的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));

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

InvalidCastException:指定的强制转换无效。

我曾尝试使用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>的辅助函数,它基本上就是为你做的地方和演员。

以上是关于无效的IObservable转换,运行时异常的主要内容,如果未能解决你的问题,请参考以下文章

将 Stream 转换为 Image 时参数无效异常

lpvoid到接口引用无效的强制转换异常

通过 UCanAccess 插入时出现“强制转换的字符值无效”错误

是否可以将 IObservable<T> 转换为 IAsyncEnumerable<T>

运行所选代码生成器时出错:无效指针(异常来自HRESULT:0x80004003(E_POINTER))

PowerShell 代码在从 PowerShell 命令提示符运行时有效,但在双击运行或转换为可执行文件时无效