Jon*_*n M 4 c# generics inference
给定以下接口/类:
public interface IRequest<TResponse> { }
public interface IHandler<TRequest, TResponse>
where TRequest : IRequest<TResponse>
{
TResponse Handle(TRequest request);
}
public class HandlingService
{
public TResponse Handle<TRequest, TResponse>(TRequest request)
where TRequest : IRequest<TResponse>
{
var handler = container.GetInstance<IHandler<TRequest, TResponse>>();
return handler.Handle(request);
}
}
public class CustomerResponse
{
public Customer Customer { get; set; }
}
public class GetCustomerByIdRequest : IRequest<CustomerResponse>
{
public int CustomerId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试编写如下内容,为什么编译器无法推断出正确的类型:
var service = new HandlingService();
var request = new GetCustomerByIdRequest { CustomerId = 1234 };
var response = service.Handle(request); // Shouldn't this know that response is going to be CustomerResponse?
Run Code Online (Sandbox Code Playgroud)
我只是得到'类型参数无法推断'的消息.这是一般的泛型类型推断的限制,还是有办法使这项工作?
你有约束TRequest : IRequest<TResponse>,但这并不意味着TResponse可以自动推断TRequest.考虑到类可以实现多个接口,并且TRequest可以实现多种 IRequest<TResponse>类型; 您可能不会在自己的设计中执行此操作,但编译器必须在整个类层次结构中推测以推断该特定参数,这将非常复杂.
简而言之,该Handle方法需要两个通用类型参数(TRequest和TResponse),并且您只给它一个它实际可以使用的参数.Inferrence仅发生在实际的类型参数上,而不是它们继承或实现的类型.
| 归档时间: |
|
| 查看次数: |
1460 次 |
| 最近记录: |