为什么不能从扩展方法使用中推断出类型?

2 c# generics extension-methods

请参阅以下最近的答案:

/sf/answers/2549499291/

总而言之,已经编写了一个使用泛型的扩展方法:

static TResult GetEntry<TEnum, TResult>(this Dictionary<TEnum, string> dictionary, TEnum key) {...}
Run Code Online (Sandbox Code Playgroud)

这样调用时一切正常:

var attributes = new Dictionary<MyTestEnum, string>();
var result = attributes.GetEntry<MyTestEnum, double>(MyTestEnum.First);
Run Code Online (Sandbox Code Playgroud)

但如果我以不同方式调用它:

var result = attributes.GetEntry(MyTestEnum.First);
Run Code Online (Sandbox Code Playgroud)

显然,编译器无法再推断出类型.但是很清楚地看到(基于什么 attributes),我试图通过什么类型.

为什么我必须明确我传递的类型?感觉就像不必要的代码.

通常这样的问题可以通过示例用法来回答,如果没有这种额外信息就会"破解" - 但我想不出像这样的任何场景.

更多背景

我之所以尝试放弃那一点语法的原因是因为我(模糊地)回想起能够通过某些通用用途这样做.我想看看它如何适用于这样的集合.

Jon*_*nna 5

但是很清楚地看到(基于什么属性),我试图通过什么类型.

但不是你试图通过它.

TResult不依赖于任何传递的类型,所以有想要无从得知GetEntry<MyTestEnum, double>,而不是GetEntry<MyTestEnum, int>GetEntry<MyTestEnum, MyTestEnum>或你有什么.

有时人类使用比编译器使用更广泛的上下文可以看到即使编译器无法推断出它的含义,但这不是其中之一.我只能猜你可能想要,GetEntry<MyTestEnum, double>因为这是你在问题中早先使用的例子.

如果另一方面你有类似的东西:

public static TResult GetEntry<TKey, TResult>(Dictionary<TKey, TResult> dict, TKey key)
{
  return dict[key];
}
Run Code Online (Sandbox Code Playgroud)

然后因为所有类型参数都与它所调用的部分签名相关,所以它确实是可推断的,尽管仍然存在更微妙的情况,其中这种推断不可能发生.