gpt4 book ai didi

c# - 为什么不能推断这些泛型类型参数?

转载 作者:行者123 更新时间:2023-12-02 00:09:03 25 4
gpt4 key购买 nike

给定以下接口(interface)/类:

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; }
}

如果我尝试编写如下内容,为什么编译器无法推断出正确的类型:

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?

我刚刚收到“无法推断类型参数”消息。这通常是泛型类型推断的限制,还是有办法让它工作?

最佳答案

您有约束 TRequest : IRequest<TResponse> ,但这并不意味着 TResponse可以从TRequest自动推断。考虑到类可以实现多个接口(interface)并且 TRequest可以实现几个 IRequest<TResponse>类型;您可能不会在自己的设计中这样做,但是对于编译器来说,必须费力地遍历整个类层次结构来推断该特定参数会非常复杂。

长话短说,Handle方法需要两个泛型类型参数( TRequestTResponse ),而您只给它一个它可以实际使用的参数。推理仅发生在实际类型参数上,而不是它们继承或实现的类型上。

关于c# - 为什么不能推断这些泛型类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2990275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com