gpt4 book ai didi

c# - 什么是隐式泛型类型参数

转载 作者:可可西里 更新时间:2023-11-01 09:00:20 32 4
gpt4 key购买 nike

所以,我遇到了 Servy ( https://stackoverflow.com/a/15098242/496680 ) 的回答,他的一些代码是这样做的:

public static int BinarySearch<TSource, TKey>(...)

对于一个扩展方法,但是他这样调用它:

arr.BinarySearch(...)

我四处询问,有人提到它是一个隐含的泛型类型参数。我用谷歌搜索了它们,但没有找到关于它们的信息。我了解泛型的工作原理,但我不明白如何/何时使用它们。

  1. 为什么 servy 在他的扩展方法中使用它们?
  2. 是否有更正式的名称可供我搜索?

最佳答案

好吧,您遗漏了使这一切正常运行的最重要的部分。类型参数可以通过实际传入的对象参数推断出来。

例如:

static class Extensions {
internal static IEnumerable<U> Test<T, U>(
this IEnumerable<T> items,
Func<T, U> converter) {
foreach (T item in items) {
yield return converter(item);
}
}
}

此扩展方法适用于任何 IEnumerable 类,并将根据您提供的转换器将枚举中的每个项目转换为另一种类型。这是标准泛型。

现在,有很多方法可以调用这个方法:

IEnumerable<int> values = Enumerable.Range<int>(1, 10);
Func<int, string> converter = i => i.ToString("0.00");

// Variation 1, explicit calling
IEnumerable<string> results1 = Extensions.Test<int, string>(values, converter);

// Variation 2, explicit calling with type inference
IEnumerable<string> results2 = Extensions.Test(values, converter);

// Variation 3, extension method calling, still providing explicit types
IEnumerable<string> results3 = values.Test<int, string>(converter);

// Variation 4, extension method with type inference
IEnumerable<string> results4 = values.Test(converter);

所有四种变体都调用相同的方法并返回相同的结果。类型推断的工作原理是查看传递的参数并根据提供的内容自动推断它们的类型。在我们上面的示例中,它能够确定类型 T类型为 int因为我们传入了一个 IEnumerable<int>进入 IEnumerable<T> 的参数.它还能够推断出类型 U类型为 string因为我们传入了一个与 T 的初始类型匹配的 Func与 int并返回一个字符串。所以 Func<T, U>填充了我们的转换函数Func<int, string> .

从上面的推论来看,这是一个标准的泛型方法。类型推断和扩展方法只不过是方便/语法糖。事实上,如果你反编译输出,你可以看到扩展方法被静态调用所取代,并且通常用显式填写的类型参数定义。 (这取决于您的反编译器和设置的选项)。

关于c# - 什么是隐式泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15099812/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com