- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在研究泛型和委托(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/41446498/
基础问题 我要解决的基本问题是: 我有一个模板参数包 ArgTypes,我需要用包装在 std::optional 中的每个类型创建一个元组。例如:make_optional_tuple应该返回 st
我使用 createEntityAdapter 设置了一个简单的 redux store。初始状态包含实体、ID、状态、错误设置等 const carouselEventAdapter = creat
我有一些(遗留)代码,如下所示: void castFoo(string type, void* foo) { FooA* foo_a = NULL; FooB* foo_b = NULL;
我的代码是 const int *const ptrA = nullptr; auto *ptrB = &ptrA; 我对 const int *const ptrA 的看法是: (*
我目前正在尝试用 C++ 实现 XOR 链表。我尝试使用模板使其通用。编译时会弹出此错误,我无法解决这个问题。 我尝试使用模板在谷歌上搜索 XOR 链表,但到目前为止似乎还没有实现它。 异或链表.h:
我正在尝试找到一种方法来调用多个类成员函数,每个函数都有不同的参数,并且在调用前后会发生某些已知功能。 这个包装函数是我试过的,但是例如对它的最终调用不会编译错误: 'bool Wrapper(Wor
此代码在 上编译成功g++ ( Coliru ) ,但不是 Visual C++ ( rextester ) - 在线和我的桌面。 它是一个更大的 Visual Studio 2015 项目的简化版本
我正在尝试编写一个通用类,它传递一个键 key 对应于一组已知接口(interface)中的一个的键,稍后可以传递一个对象 thing 并类型安全地访问 thing[key]。这是我得到的: inte
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!