Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IObservable的强制转换无效,运行时异常_C#_Generics_Casting_System.reactive_Unirx - Fatal编程技术网

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

C# IObservable的强制转换无效,运行时异常,c#,generics,casting,system.reactive,unirx,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 : IGa

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

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);
}
公共接口IGameAction{}
//示范行动
公共结构OpenDoorAction:IGameAction{}
//In-Store.cs
公共主体诉讼;
public IObservable When()其中T:IGameAction
{
//这里例外
返回(IObservable)this.Actions.Where(action=>action是T);
}
这样使用时:

this.When<OpenDoorAction>()
    .Subscribe(a => Debug.Log(a));
this.When()
.Subscribe(a=>Debug.Log(a));
针对上面标记的行引发以下异常:

InvalidCastException:指定的强制转换无效

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


FWIW这是在Unity3D中使用的

这是因为在
IObservable
IObservable
之间没有直接转换,即使您已指定了约束

您应该改为在流中重新转换各个项目:

返回this.Actions.Where(action=>action是T.Cast()

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



正如
mjwills
在评论中指出的那样,存在一个
IObservable.OfType
的助手函数,它基本上只为您执行where和cast操作。

当然应该!这基本上只是为你做了
Where
Cast
。啊哈,这很有意义!我还必须指定源类型,因此
this.Actions.OfType()
。对于好奇的人来说,
.Cast
做了一些类似于
的事情。选择(a=>(T)a)
,这也是问题的“解决方案”。谢谢