F#中IHubContext强制转换无效致代码无法编译,为何与文档不符?
问题
以下F#代码无法编译:
open Microsoft.AspNetCore.SignalR type Hub1() = inherit Hub() let ctx1 = Unchecked.defaultof<IHubContext<Hub1>> let ctx2: IHubContext = upcast ctx1 let ctx3 = ctx1 :> IHubContext
根据微软官方文档,这段代码应该可以正常编译,请问忽略了什么关键点?
解答
问题核心在于泛型IHubContext<THub>与非泛型IHubContext之间不存在继承或实现关系,F#的:>和upcast只支持有继承/实现关系的类型转换,所以代码里的转型操作会编译失败。
微软文档中提到的“在泛型代码中使用IHubContext”,实际是指依赖注入获取的泛型IHubContext<THub>可直接用于消息发送逻辑,并非指它能直接转型为非泛型接口。
解决思路:
- 若需使用非泛型上下文,直接注入
IHubContext即可; - 若业务逻辑依赖泛型的
IHubContext<Hub1>,则保持使用该泛型类型,不要强行转为非泛型版本。
内容的提问来源于stack exchange,提问作者Franco Tiveron
相关产品推荐
相关产品推荐

