为什么不能泛型 用代码编写的操作需要显式参数声明



出于某种原因,我有一种感觉,只有Jon Skeet会知道这个问题的答案,但值得一试。

我有此方法存根,用作生成命令的代理。

public static void SetCommand<T>(string commandName, Action<T> execution)
where T : new()
{
//Omitted unimportant
}

我有一个调用此代码的函数,但行为因调用方式而异。

如果我通过显式声明操作来调用代码,则所有参数都可以很好地解析

Action<ClassDeclarationOptions> test = (t) => { };
SetCommand(GENERATE_CLASS_COMMAND, test);

但是,如果我声明一个函数来表示我的操作

public static void GenerateClass(ClassDeclarationOptions classOptions)
{
}

然后我需要在将参数传递给函数时显式声明参数,如下所示:

SetCommand<ClassDeclarationOptions>(GENERATE_CLASS_COMMAND, Commands.GenerateClass);

有人可以解释为什么编译器无法从方法定义解析我的泛型参数吗

假设Commands.GenerateClass上有一个重载,它采用不同的参数类型,例如:

public static void GenerateClass(SomeOtherClass stuff)
{
}

现在,编译器无法确定要使用哪种GenerateClass方法。但是,一旦指定了类型参数,歧义就会消失。

因此,即使您有一个方法并且编译器推断了类型参数,您也可以稍后添加第二个方法并在没有意识到的情况下破坏现有代码。强制代码显式要安全得多。

最新更新