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

标签 c# generics

出于某种原因,我有一种感觉,只有 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/

相关文章:

c# - 你能提供数组排序的替代算法吗?

java - 解决Java中的 "unchecked warning",避免@suppressWarnings

C# 通用扩展方法装箱转换问题

c# - 通用冒泡排序扩展

java - 使用通配符泛型编译

C# SHA-256 与 Java SHA-256。不同的结果?

c# - 如何使用 C# 启动具有特定 URL 的 Google Chrome 选项卡

c# - 如何使调试与发布之间的编译不同?

generics - rust 报告在模板化代码时不能移出取消引用

c# - 从网站动态生成列表框数据,windows phone 7