我正在试图让这项工作变得棘手,但我不知道如何以某种方式告诉编译器类型以避免明确说明它们。
考虑一个这样的简单界面:
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());
}
}
为什么编译器在这种情况下无法推断出类型,如果可能的话,如何更改代码以启用推理?
答案 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
的类型是没有意义的,因此您提出的问题不需要解决方案。它只需要完全避免。