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

时间:2017-07-25 20:06:23

标签: c# generics

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

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

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

我有一个调用此代码的函数,但行为的不同取决于它的调用方式。

如果我通过明确声明一个Action来调用代码,则所有参数都可以解析

public static void GenerateClass(ClassDeclarationOptions classOptions)
{

}

但是,如果我声明一个代表我的行动的函数

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

然后我需要在将参数传递给函数时明确声明参数:

employees = ["1G8764897", "1J6734897", "1J5292897"]
jobs = len(employees)
print

widgets = ['Processed: ', Counter(), ' of ', str(len(employees)),  ' profiles (', Timer(), ')']
pbar = ProgressBar(widgets=widgets)
for i in pbar((i for i in employees)):
    time.sleep(.01)
    fetchdata(i)
print "done"

有人可以解释为什么编译器无法从方法定义

解析我的通用参数

1 个答案:

答案 0 :(得分:3)

我们假设Commands.GenerateClass上的重载采用了不同的参数类型,例如:

public static void GenerateClass(SomeOtherClass stuff)
{
}

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

因此,即使您有一个方法并且编译器推断出类型参数,您也可以稍后添加第二个方法并破坏现有代码,甚至不会意识到它。更加安全,只是为了强制代码明确。