【问题标题】:Inferring generic parameter type from a callback function从回调函数推断泛型参数类型
【发布时间】:2026-01-28 19:50:02
【问题描述】:

我有一段代码目前看起来像这样:

订阅方法的签名:

void Subscribe<T, TResult>(Func<T, TResult> action);

class Service { 
   int methodThatRequiresIntAndReturnsInt(int i) => i * 2;
}

在我看来,在尝试使用 subscribe 方法时应该可以推断 T 和 TReturn 的类型,但是编译器告诉我无法从使用中推断出类型,这意味着我最终编写了以下代码:

Queue.Subscribe<int, int>(Service.methodThatRequiresIntAndReturnsInt);

我的问题是它是否可能,如果可能,方法签名/用法应该如何看待,以便可以在没有类型提示的情况下使用它,例如:

Queue.Subscribe(input => input * 2);

目前的实现大致如下:

_commandSubscription.Subscribe<CreateUpdateCommand, bool>(Resolve<UpdateService>().CreateUpdate);
_commandSubscription.Subscribe<AddCommentCommand>(Resolve<UpdateService>().AddComment);

服务方法的实现如下:

public class UpdateService {

    public void AddComment(AddCommentCommand command) {
         // DO STUFF
    }

    public bool CreateUpdate(CreateUpdateCommand command) {
        // Do stuff 
        return true;
    }

}

【问题讨论】:

  • Subscribe 方法的返回类型是什么?是TResult 吗?你应该退货,我相信

标签: c# api generics callback


【解决方案1】:

您可以执行以下操作:

Queue.Subscribe((int i) => Service.methodThatRequiresIntAndReturnsInt(i));

实际上,订阅函数的工作方式是等效的,您可以避免显式键入所有泛型参数。

【讨论】:

  • 感谢您的回答,这改进了代码,我至少不需要提供返回类型。