繁体   English   中英

C#中的通用类型返回和参数顺序

[英]Generic Type Return and Argument order in c#

我想创建一个通用方法,如下所示:

Task<Response> PerformSomeAction<Request, Response>(
                Request request, string token) 
                where Response : ResponseModel
                where Request : RequestModel;

在声明时,我们需要保持任何顺序吗?

我们也可以像下面这样写吗?

Task<Response> PerformSomeAction<Response, Request>(
                    Request request, string token) 
                    where Response : ResponseModel
                    where Request : RequestModel;

都一样吗

更新资料

声明通用参数不需要任何顺序,但是可以用看起来合理的方式编写它们,这是您的第一个示例(对我而言似乎更合逻辑)。

原版的

我正沿着这条花园的小路走去,完全误解了这个问题

您的调用代码无法切换通用参数,因为您对该方法有约束。 在这种情况下,您唯一的选择是对同一方法进行不同的重载。

就是说,第一个通用参数期望使用您在约束中表示的RequestModel类型,因此无法将其发送给ResponseModel。 例如

PerformSomeAction<SomeResponse,SomeRequest>()  

您可以(但是)重载签名和通用参数

枫树

public class SwitchAroo
{
    Task<Response> PerformSomeAction<Request, Response>(
                    Request request, string token) 
                    where Response : ResponseModel
                    where Request : RequestModel { ... }

    Task<Response> PerformSomeAction<Response, Request>(
                        Request request, string token) 
                        where Response : ResponseModel
                        where Request : RequestModel { ... }
}

也只是为了好玩。 编译器将让您像这样(通常)重载,因为签名根本不同

static Task<U> PerformSomeAction<T, U>(
   T request, string token)  { ... }

static Task<U> PerformSomeAction<U, T>(
   T request, string token)  { ... }

但这不是这样,因为签名本质上是相同的(如果可以的话,会引发各种奇怪的重载解决问题)

static Task<U> PerformSomeAction<T, U>(
   T request, string token)  { ... }

static Task<U1> PerformSomeAction<T1, U1>(
   T1 request, string token)  { ... }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM