gpt4 book ai didi

c# - 无法从 Action 推断出类型参数,但可以从 Func 推断出类型参数

转载 作者:太空狗 更新时间:2023-10-29 18:29:05 27 4
gpt4 key购买 nike

我一直在研究泛型和委托(delegate),但我发现了一些我不理解的东西。我有非常相似的通用静态方法,一个接受 Action<T>第二个接受 Func<T> .现在的问题是:如果我调用接受 Func<T> 的人没有明确的类型,编译器就可以了。但是接受 Action<T> 的人我的程序无法编译(请参阅错误消息的代码)。

我的问题是:为什么编译器能够识别返回类型,但不能识别参数类型?

public interface IMessage
{ }

public class Message : IMessage
{
}
static void HandleAction<TMessage>(Action<TMessage> action)
where TMessage : IMessage
{ }

static void HandleFunction<TMessage>(Func<TMessage> action)
where TMessage : IMessage
{ }

static void A(Message message)
{ }

static Message F()
{
return new Message();
}

static void Main(string[] args)
{
// this one is ok
HandleFunction(F);

// compiler error:
// The type arguments for method
// 'template_test.Program.HandleAction<TMessage>(System.Action<TMessage>)'
// cannot be inferred from the usage.
//Try specifying the type arguments explicitly.
//HandleAction(A);

// this one is ok
HandleAction<Message>(A);
}

我在 Visual Studio 2012 中使用 .NET 4.5。

最佳答案

方法可以通过它们的参数重载,所有重载形成一个方法组,例如 void Xyz(int i)void Xyz(string s ) 在名为 Xyz 的同一方法组中。即使用户只定义了一个方法,编译器也无法推导出一种类型的参数,因为编译器的行为非常严格。

方法不能被返回类型重载,所以你不能在同一个类中有 int Xyz()string Xyz()。编译器可以很容易地推导出返回类型,因为没有重载。

第一次对我来说并不明显,但在我意识到我可以创建一个重载之后,它已经很清楚了。

关于c# - 无法从 Action<T> 推断出类型参数,但可以从 Func<T> 推断出类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22669968/

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