Что такое TSource в С#.NET?

Вопрос

Что такое TSource?

Вот пример из MSDN:

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

Это тип? Не удалось найти на нем документацию MSDN. Я предполагаю, что это не может быть тип, поскольку я не мог нажать на него в .NET Reflector.

Это ключевое слово .NET? Не нашел его в списке С#.

Разве это компилятор .NET интерпретирует особым образом?

Что я уже знаю

Я знаю, что T является типичным параметром типа, который используется как заполнитель в общем методе. Пример из Что такое Generics из 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();

Ответы

Ответ 1

TSource - это просто типичный параметр типа. Вы можете сказать это, потому что он входит в угловые скобки после имени метода в объявлении:

public static IEnumerable<TSource> Union<TSource>

Вы можете использовать любой идентификатор для имени параметра типа, поэтому это было бы одинаково справедливо:

public static IEnumerable<Foo> Union<Foo>

Однако обычно используется T или имя, начинающееся с T. В этом случае он указывает тип "источника" элемента объединения. Обычно методы LINQ используют следующие имена параметров типа:

  • TSource: тип элемента ввода (источник)
  • TResult: тип элемента вывода (результат)
  • TKey: тип элемента ключа, используемого для таких вещей, как группировка
  • TElement: тип элемента промежуточной последовательности - это реже используется, но в отображаются некоторые перегрузки GroupBy и аналогичные методы

Ответ 2

TSource - это то же самое, что и T, просто названное по-разному, чтобы быть более описательным

Вы можете увидеть больше примеров этого в Func<T, TResult> и многочисленных других общих классах. Ниже приведено краткое соглашение об именах для генериков из msdn.

Укажите общие параметры типа с описательные имена, если только один имя письма полностью само собой пояснительное и описательное имя не добавит значения.

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

Ответ 3

TSource эквивалентен T. При наличии более одного универсального типа лучше называть их "читаемым" способом, а не использовать одиночные буквы.

Например, для .NET-типа Func в документах MSDN есть пример "Func<T, TResult>". Именование общего параметра таким образом облегчает вам понимание того, что вы ожидаете от объекта.

Ответ 4

Это параметр generics для типа. TSource - это просто имя, которое нужно заменить реальным типом. Все TSource должны быть заменены на один и тот же тип.

Если у вас

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

тогда item1 и item3 должны быть одного типа, item2 и item4 должны быть одного типа. Но item1 и item2 не должны быть одного типа.

Ответ 5

TSource похож на T, только называемый TSource. Они могли бы назвать U, V, Z. Они назвали его TSource.

Ответ 6

TSource является более значимым именем вместо T. Это необходимо, потому что классы и методы могут иметь более одного параметра типа (а метод может иметь другой класс, чем класс, ofc.), Т.е. IDictionary<TKey, TValue>.