c# - 为什么 C# 不能识别泛型
问题描述
我想我迷路了。我试图创建一个包含两个具有约束的通用条目的方法。
然而,编译器即使接收到指定泛型类型的实例,也表示无法进行强制转换。
对此有何解释?
编译错误消息( IResponseStreamMessage )中指向的“表达式类型”正是TResponse约束IResponseStreamMessage。我没看到什么?还是知道?
只是为了确保,这是GetResponseStreamOf方法签名:
public static IResponseStreamMessage GetResponseStreamOf(IRequestStreamMessage request)
更新:一旦我进行了明确的演员表,它就会接受:
public static TResponse Get<TRequest, TResponse>(TRequest request, Func<System.IO.Stream> dataProviderFunction)
where TRequest : IRequestStreamMessage
where TResponse : IResponseStreamMessage
{
return (TResponse) StreamMessagesFactory.GetResponseStreamOf(request);
}
但我仍然不明白为什么我也有。
解决方案
我认为对于您给定的代码,泛型不是一个好的选择,因为它没有提供任何好处。
如果它们被简单地替换并且它将按预期运行,那么它们既不会TRequest
或实际上也不会从通用性中受益,并具有实际编译的额外好处。TResponse
IRequestStreamMessage
IResponseStreamMessage
至于为什么会这样,您应该考虑Get<TRequest, TResponse>
方法的主体,唯一的内部方法GetResponseStreamOf
不是通用的。
此代码与没有泛型的类似实现的唯一区别是强制转换 (to TResponse
) 将在方法内或方法外的位置,这也可能是一个有争议的问题,因为我怀疑调用者很可能对接口很好也是。
推荐阅读
- c - 在 C 中,我怎样才能为我的平台获得适当的内存对齐?
- php - php8升级后laravel代客不起作用
- css - 仅当我们在模态内容之外单击时才关闭覆盖
- python - 如何在 python gpgme 中使用高级(低级)函数来删除一个键?
- mysql - 删除重复项后如何求和
- mysql - 如何设置具有复合主键的外键?
- spring - 使用 @Valid 和 Thymeleaf 验证 spring-boot 中的输入
- sql - PosgreSQL 语法转换为雪花 - Group by Clause 问题
- git - 如何删除要求凭据的 github 登录弹出窗口?
- asp.net - 在 ASP.NET Web 窗体中使用 OpenId Connect 时的身份验证 Cookie 超时