如何在此方案中利用类型推断?

时间:2018-06-15 22:17:01

标签: c# generics type-inference

我正在试图让这项工作变得棘手,但我不知道如何以某种方式告诉编译器类型以避免明确说明它们。

考虑一个这样的简单界面:

interface ICommand<TResult> { }

示例实现:

class SomeCommand : ICommand<int> { }

现在,我们有一个通用的处理器接口:

interface ICommandProcessor
{
    TResult Process<TCommand, TResult>(TCommand command)
        where TCommand : ICommand<TResult>;
}

当我尝试将此接口与具体的命令对象一起使用时,我仍然从编译器中得到类型推断错误:

  

错误CS0411方法的类型参数&#39; ICommandProcessor.Process(TCommand)&#39;无法从使用中推断出来。尝试明确指定类型参数。

class Consumer
{
    private readonly ICommandProcessor _commandProcessor;

    Consumer(ICommandProcessor commandProcessor)
    {
        _commandProcessor = commandProcessor;
    }

    public int SomeMethod()
    {
        return _commandProcessor.Process(new SomeCommand());
    }
}

为什么编译器在这种情况下无法推断出类型,如果可能的话,如何更改代码以启用推理?

1 个答案:

答案 0 :(得分:1)

我认为这是你陷入困境的地方:

public int SomeMethod()
{
    return _commandProcessor.Process(new SomeCommand());
}

听起来你想知道为什么C#没有推断出Process的返回类型是int。从逻辑上讲,int是它能够生成的唯一返回类型。然而,Process不需要知道其论证的具体类型来实现这一点。

interface ICommandProcessor
{
    TResult Process<TResult>(ICommand<TResult> command);
}

这足以推断Process的返回类型,而Process对于了解实施ICommand的具体类型没有用,技术上讲,Process 不能知道具体类型,除非你在类型约束(where TCommand : SomeCommand)中指定它,这无论如何都没用。

推断Command的类型是没有意义的,因此您提出的问题不需要解决方案。它只需要完全避免。