Что такое 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>
.