在重写我的事件调用函数以一般地处理事件及其参数之后,我开始检查我的代码(以匹配更改),并且我注意到编译器隐式地进行了泛型调用。
这是我的功能:
private void InvokeEvent<TArgs>(EventHandler<TArgs> invokedevent, TArgs args)
where TArgs : EventArgs
{
EventHandler<TArgs> temp = invokedevent;
if (temp != null)
{
temp(this, args);
}
}
以下是调用函数的行:
InvokeEvent(AfterInteraction, result);
这个编译没有问题,智能感知甚至显示“正确”的调用(带有部分)。
这是一个编译器功能(实际上,泛型类型可以直接从第二个参数推断出来),还是我疯了什么都没有,并且忽略了这一点?
答案 0 :(得分:6)
如果编译器可以推断所有类型参数,那么您不需要显式指定它们。在这种情况下,它可以从第二个参数推断TArgs
。
但如果它无法推断所有类型参数,则需要指定所有这些参数,甚至是编译器可以推断出的参数。
答案 1 :(得分:3)
是呼叫类型推断,请阅读here,搜索“类型推断”一章
答案 2 :(得分:2)
正如您所说,编译器已从第二个参数推断出类型。