Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在这种情况下,我如何利用类型推断?_C#_Generics_Type Inference - Fatal编程技术网

C# 在这种情况下,我如何利用类型推断?

C# 在这种情况下,我如何利用类型推断?,c#,generics,type-inference,C#,Generics,Type Inference,我正绞尽脑汁试图让它工作,但我不知道如何告诉编译器类型,以避免显式地声明它们 考虑这样一个简单的界面: interface ICommand<TResult> { } 在这种情况下,为什么编译器无法推断类型?如果可能的话,我如何更改代码以启用推断?我想这正是您需要解决的问题: public int SomeMethod() { return _commandProcessor.Process(new SomeCommand()); } 听起来你想知道为什么C不推断进程的返

我正绞尽脑汁试图让它工作,但我不知道如何告诉编译器类型,以避免显式地声明它们

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

interface ICommand<TResult> { }

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

我想这正是您需要解决的问题:

public int SomeMethod()
{
    return _commandProcessor.Process(new SomeCommand());
}
听起来你想知道为什么C不推断
进程
的返回类型是
int
。从逻辑上讲,
int
是它能够生成的唯一返回类型。然而,
Process
不需要知道它的参数的具体类型来实现这一点

interface ICommandProcessor
{
    TResult Process<TResult>(ICommand<TResult> command);
}
接口ICommandProcessor
{
TResult进程(ICommand命令);
}
这足以推断出
进程
的返回类型,
进程
对于知道具体类型没有用处,实现
ICommand
,从技术上讲,
进程
无法知道具体类型,除非在类型约束中指定它(
其中TCommand:SomeCommand
),反正也没用


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

你为什么还要这样做?知道那种类型没有意义。我甚至不确定短语“了解该类型”在这种情况下是否有意义。为什么不在
ICommandProcessor
中使用
targetprocess(ICommand命令)
?看起来你过于复杂化了你的泛型参数,然后把它们限制在特定的类型上。@RonBeyer的建议会一直起作用,直到你遇到一个
SomeOtherCommand:ICommand,ICommand
,不管你怎么做,这个方法都会有问题。
class Consumer
{
    private readonly ICommandProcessor _commandProcessor;

    Consumer(ICommandProcessor commandProcessor)
    {
        _commandProcessor = commandProcessor;
    }

    public int SomeMethod()
    {
        return _commandProcessor.Process(new SomeCommand());
    }
}
public int SomeMethod()
{
    return _commandProcessor.Process(new SomeCommand());
}
interface ICommandProcessor
{
    TResult Process<TResult>(ICommand<TResult> command);
}