出于某种原因,我有一种感觉,只有 Jon Skeet 知道这个问题的答案,但值得一试。
我有这个方法 stub ,它用作生成命令的代理。
public static void SetCommand<T>(string commandName, Action<T> execution)
where T : new()
{
//Omitted unimportant
}
我有一个函数正在调用此代码,但行为因调用方式而异。
如果我通过显式声明一个 Action 来调用代码,所有参数都可以正常解析
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
方法。然而,一旦指定类型参数,歧义就会消失。
因此,即使您有一个方法并且编译器推断出类型参数,您也可以稍后添加第二个方法并破坏现有代码,甚至没有意识到这一点。强制代码显式更安全。
关于c# - 为什么不能泛型代码中编写的操作需要显式参数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45312559/