什么是C#.NET中的TSource?

Ler*_*rve 16 .net c# generics

什么是TSource

以下是MSDN的一个示例:

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和类似方法的一些重载中

  • 您的评论"您可以使用*任何*标识符作为类型参数名称"使灯泡亮起.谢谢. (2认同)

Mar*_*man 6

TSourceT只是命名不同以更具描述性相同

您可以在Func<T, TResult>许多其他泛型类中看到更多这样的例子。这是msdn 中泛型的快速命名约定。

使用描述性名称命名泛型类型参数,除非单个字母名称是完全不言自明的,并且描述性名称不会增加价值。

public interface ISessionChannel<TSession> 
{...}
public delegate TOutput Converter<TInput,TOutput>(TInput from);
Run Code Online (Sandbox Code Playgroud)


Alb*_*nbo 5

它是类型的泛型参数。TSource只是“替换为真实类型”的名称。必须全部TSource更换为相同类型。

如果你有

public static bool Foo<T1, T2>(
    T1 item1,
    T2 item2,
    T1 item3,
    T2 item4,
)
Run Code Online (Sandbox Code Playgroud)

那么item1item3必须是同一类型,item2并且item4必须是同一类型。但item1item2不必是同一类型。