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

Why can types not be inferred from extension method usage?

查看以下最近的回答:

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

static TResult GetEntry<TEnum, TResult>(this Dictionary<TEnum, string> dictionary, TEnum key) {...}

像这样调用时一切正常:

var attributes = new Dictionary<MyTestEnum, string>();
var result = attributes.GetEntry<MyTestEnum, double>(MyTestEnum.First);

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

var result = attributes.GetEntry(MyTestEnum.First);

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

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

通常像这样的问题会用示例用法来回答,'break' 没有这种额外的信息 - 但我想不出任何这样的场景。

更多上下文

我什至一开始就尝试放弃那部分语法的原因是因为我(模糊地)记得能够通过某些通用用途这样做。我想看看它如何应用于这样的集合。

But it's very clear to see (based on what attributes is), what type I'm attempting to pass.

但不是你试图通过它的方式。

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];
}

然后因为所有类型参数都与调用它的签名的一部分相关,所以它确实是可以推断的,尽管仍然存在无法进行此类推断的更微妙的情况。