gpt4 book ai didi

c# - 为什么不能用代码写的泛型Actions需要显式参数声明

转载 作者:行者123 更新时间:2023-11-30 21:39:12 26 4
gpt4 key购买 nike

出于某种原因,我觉得只有 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# - 为什么不能用代码写的泛型Actions需要显式参数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45312559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com