题
什么是TSource?
public static IEnumerable<TSource> Union<TSource>(
this IEnumerable<TSource> first,
IEnumerable<TSource> second,
IEqualityComparer<TSource> comparer
)
Run Code Online (Sandbox Code Playgroud)
这是一种类型吗?找不到任何MSDN文档.我认为它不能是一种类型,因为我无法在.NET Reflector中单击它.
它是.NET关键字吗?没有在C#关键字列表中找到它.
它是.NET编译器以特殊方式解释的吗?
我所知道的
我知道这T是一个泛型类型参数,在泛型方法中用作占位符.来自MSDN的什么是泛型的示例:
public class Stack<T>
{
T[] m_Items;
public void Push(T item)
{...}
public T Pop()
{...}
}
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
int number = stack.Pop();
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 29
TSource只是一个泛型类型参数.你可以告诉它,因为它出现在声明中的方法名称之后的尖括号中:
public static IEnumerable<TSource> Union<TSource>
Run Code Online (Sandbox Code Playgroud)
您可以使用任何标识符作为类型参数名称,因此这同样有效:
public static IEnumerable<Foo> Union<Foo>
Run Code Online (Sandbox Code Playgroud)
然而,传统上,使用任一个T或以名称开头的名称T.在这种情况下,它指示联合的"源"元素的类型.LINQ方法通常使用以下类型参数名称:
TSource:输入的元素类型(源)TResult:输出的元素类型(结果)TKey:用于分组等事项的键的元素类型TElement:中间序列的元素类型 - 这种情况很少使用,但它出现在GroupBy和类似方法的一些重载中TSource与T只是命名不同以更具描述性相同
您可以在Func<T, TResult>许多其他泛型类中看到更多这样的例子。这是msdn 中泛型的快速命名约定。
使用描述性名称命名泛型类型参数,除非单个字母名称是完全不言自明的,并且描述性名称不会增加价值。
public interface ISessionChannel<TSession>
{...}
public delegate TOutput Converter<TInput,TOutput>(TInput from);
Run Code Online (Sandbox Code Playgroud)
它是类型的泛型参数。TSource只是“替换为真实类型”的名称。必须全部TSource更换为相同类型。
如果你有
public static bool Foo<T1, T2>(
T1 item1,
T2 item2,
T1 item3,
T2 item4,
)
Run Code Online (Sandbox Code Playgroud)
那么item1和item3必须是同一类型,item2并且item4必须是同一类型。但item1和item2不必是同一类型。