首页 > 解决方案 > 为什么 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);
        }

但我仍然不明白为什么我也有。

标签: c#genericscasting

解决方案


我认为对于您给定的代码,泛型不是一个好的选择,因为它没有提供任何好处。

如果它们被简单地替换并且它将按预期运行,那么它们既不会TRequest或实际上也不会从通用性中受益,并具有实际编译的额外好处。TResponseIRequestStreamMessageIResponseStreamMessage

至于为什么会这样,您应该考虑Get<TRequest, TResponse>方法的主体,唯一的内部方法GetResponseStreamOf不是通用的。

此代码与没有泛型的类似实现的唯一区别是强制转换 (to TResponse) 将在方法内或方法外的位置,这也可能是一个有争议的问题,因为我怀疑调用者很可能对接口很好也是。


推荐阅读