什么是C#.NET中的TSource?

时间:2011-02-20 13:13:32

标签: c# .net generics

问题

什么是TSource

这是example from MSDN

public static IEnumerable<TSource> Union<TSource>(
    this IEnumerable<TSource> first,
    IEnumerable<TSource> second,
    IEqualityComparer<TSource> comparer
)

是一种类型吗?找不到任何MSDN文档。我认为它不能是一种类型,因为我无法在.NET Reflector中点击它。

它是.NET关键字吗?没有在C# keywords列表中找到它。

这是.NET编译器以特殊方式解释的吗?

我已经知道

我知道T是泛型类型参数,在泛型方法中用作占位符。来自MSDN的What Are Generics示例:

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();

7 个答案:

答案 0 :(得分:27)

TSource只是泛型类型参数。你可以告诉它,因为它出现在声明中方法名称之后的尖括号中:

public static IEnumerable<TSource> Union<TSource>

您可以使用任何标识符作为类型参数名称,因此这同样有效:

public static IEnumerable<Foo> Union<Foo>

但是,传统上,使用T或以T开头的名称。在这种情况下,它指示联合的“源”元素的类型。 LINQ方法通常使用以下类型参数名称:

  • TSource:输入的元素类型(来源)
  • TResult:输出的元素类型(结果)
  • TKey:用于分组
  • 之类的键的元素类型
  • TElement:中间序列的元素类型 - 这种情况很少使用,但它出现在some overloads of GroupBy和类似的方法中

答案 1 :(得分:4)

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

您可以在Func<T, TResult>和许多其他通用类中看到更多此示例。以下是来自msdn的泛型的快速命名约定。

  

使用命名泛型类型参数   描述性名称,除非单一   字母名称完全是自我   解释性和描述性名称   不会增加价值。

public interface ISessionChannel<TSession> 
{...}
public delegate TOutput Converter<TInput,TOutput>(TInput from);

答案 2 :(得分:4)

它是类型的泛型参数。 TSource只是“被真实类型替换”的名称。必须使用相同的类型替换所有TSource

如果你有

public static bool Foo<T1, T2>(
    T1 item1,
    T2 item2,
    T1 item3,
    T2 item4,
)

然后item1item3必须属于同一类型,item2item4必须属于同一类型。但item1item2不一定是同一类型。

答案 3 :(得分:3)

TSource相当于T.当拥有多个泛型类型时,最好以“可读”的方式命名它们,而不是使用单个字母。

例如,对于.NET类型的Func,MSDN文档的示例为“Func<T, TResult>”。以这种方式命名通用参数可以让您更容易地了解您应该从对象中得到什么。

答案 4 :(得分:2)

TSource只是一个更有意义的名称,而不是T。这是必需的,因为类和方法可以有多个类型参数(并且方法可以具有与类不同的方法,ofc。),即。 IDictionary<TKey, TValue>

答案 5 :(得分:1)

TSource就像T,只叫做TSource。他们可以称之为U,V,Z。他们称之为TSource。

答案 6 :(得分:0)

<TSource>

T 表示类型。您要在此处使用的类型。