【问题标题】:What are the rules around when generic parameter types must be explicitly specified for extension methods? [duplicate]当必须为扩展方法显式指定泛型参数类型时,有哪些规则? [复制]
【发布时间】:2015-06-15 19:18:58
【问题描述】:

关于以下扩展方法:

public static class Extensions
{
    public static void P<T>(this T value) { }

    public static TResult F<T, TResult>(this T value)
    {
        return default(TResult);
    }
}

当我尝试将这些与各种类型参数选项一起使用时,我得到以下结果:

1.P(); // Compiler just fine
1.P<int>(); // R# says "Type argument specification is redundant"
var x = 1.F<int, int>(); // Compiler just fine
var y = 1.F<int>(); // Compiler error: Incorrect number of type parameters

那么为什么编译器可以为P 推断出T 的类型,却不能为F 推断出相同的类型?这种推断的规则是什么?有没有办法可以避免指定这样的类型?

【问题讨论】:

  • this T value 是您传递的任何类型。 --> 1.P&lt;int&gt;(); --> 1 已经是整数了
  • @T.S.,是的,我明白了。我不明白为什么这不适用于1.F。为什么int 被推断为P 而不是F
  • 你在F 中遇到了完全不同的问题——它是一个通用函数,没有映射就无法推断
  • @T.S.,我同意。我应该删除它,还是等待它关闭(我已经投票了;)?
  • 我不知道。我不是那么专业。可能会删除。

标签: c#


【解决方案1】:

C# 5.0 规范的第 7.5.2 节涵盖了类型推断,并介绍了确定类型推断何时能够成功和不能成功的所有规则。

对于您的两个示例,第一种情况有一个正在推断的类型的参数,这允许推断它,而在您的第二个示例中,您有一个没有上限或下限的类型参数,如没有任何参数以任何形式使用该类型,允许对其应用上限或下限。

请注意,无法推断出方法的部分(但不是全部)泛型类型参数。要么它们都可以推断出来,要么都必须显式提供,这就是为什么在向需要两个的方法提供一个泛型类型参数时会出错的原因,即使其中一个可以推断出来。

【讨论】:

  • “没有上限或下限”是什么意思
  • @YuvalItzchakov 推理算法根据参数在参数中的使用方式对泛型类型参数应用上限和下限,类型推断成功或失败取决于每个参数的边界。输入参数。
  • 仅供参考,如果您使用的是 VS 2013,则该规范可在您的 PC 上的“Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\1033”中找到
  • 仍然不明白这些界限代表什么。在这种情况下,界限在逻辑上意味着什么?
  • @YuvalItzchakov 听起来您只需要阅读有关类型推断的规范即可。我无法在此处解释 cmets 中的整个类型推断规范。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多