C# c中的泛型类型返回和参数顺序#

C# c中的泛型类型返回和参数顺序#,c#,.net,generic-programming,generic-method,C#,.net,Generic Programming,Generic Method,我想创建一个通用方法,如下所示: Task<Response> PerformSomeAction<Request, Response>( Request request, string token) where Response : ResponseModel where Request : RequestModel; 任务执行部分操作( 请求(字符串令牌) 何处响应:R

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

Task<Response> PerformSomeAction<Request, Response>(
                Request request, string token) 
                where Response : ResponseModel
                where Request : RequestModel;
任务执行部分操作(
请求(字符串令牌)
何处响应:ResponseModel
where-Request:RequestModel;
我们在申报时是否需要维护订单

我们也可以这样写吗

Task<Response> PerformSomeAction<Response, Request>(
                    Request request, string token) 
                    where Response : ResponseModel
                    where Request : RequestModel;
任务执行部分操作(
请求(字符串令牌)
何处响应:ResponseModel
where-Request:RequestModel;

两者是否相同?

更新

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 { ... }
}
在声明泛型参数时不需要顺序,但是按照它们看起来合乎逻辑的方式编写它们,您的第一个示例(对我来说似乎更合乎逻辑)

原创

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

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

也就是说,第一个通用参数需要一种类型的
RequestModel
,正如您在约束中所指出的,您不能向它发送一个ResponseModel。例如

PerformSomeAction<SomeResponse,SomeRequest>()  
PerformSomeAction()
但是,您可以重载签名和泛型参数

Exmaple

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 { ... }
}
public-class-SwitchAroo
{
任务执行某些操作(
请求(字符串令牌)
何处响应:ResponseModel
where Request:RequestModel{…}
任务执行某些操作(
请求(字符串令牌)
何处响应:ResponseModel
where Request:RequestModel{…}
}
也只是为了好玩。编译器会让你像这样重载(一般来说),因为签名是根本不同的

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

static Task<U> PerformSomeAction<U, T>(
   T request, string token)  { ... }
静态任务执行某些操作(
T请求,字符串标记){…}
静态任务执行某些操作(
T请求,字符串标记){…}
但不是这样,因为签名本质上是相同的(如果可以的话,它会引发各种奇怪的重载解决问题)

静态任务执行某些操作(
T请求,字符串标记){…}
静态任务执行某些操作(
T1请求,字符串令牌){…}

您试过了吗?感知到的好处是什么?@HoomanBahreini看起来不像你建议的复制品是相关的。。。很明显,OP知道这两个变体都可以(甚至可以在同一个类中共存)-我相信他们要求提供编码风格建议…我不知道为什么您要故意让代码混淆?对我来说,自然的顺序是:请求,响应。我会在
where
之后保持相同的顺序,以保持代码干净。现在干净多了-谢谢。(我仍然不认为OP实际上是在根据这个问题寻找这类信息)。