Опитваме се да изградим библиотечна рутина, която приема параметър за общ тип. Сблъскахме се с проблем, при който методът на разширение „Union“ не се разпознава като валиден за генерично въведения параметър, без значение как ограничаваме типа.
Ето един тривиален, силно опростен пример за илюстриране на проблема:
private IQueryable<int> Test(IQueryable<int> temp1, IQueryable<int> temp2)
{
return temp1.Union(temp2); // compiles fine
}
private T Test<T>(T temp1, T temp2) where T : IQueryable
{
return temp1.Union(temp2); // Error 15 'T' does not contain a definition for 'Union' and no extension method 'Union' accepting a first argument of type 'T' could be found
}
Проблемът изглежда е, че Union се прилага като метод за разширение на IQueryable, а не като част от самия интерфейс на IQueryable. Изглежда, че трябва да има доста прост начин това да работи, но претърсвах StackOverflow и Google, без никакъв късмет. Всяка помощ е много ценена.
=================================
Редактиране:
Вярно е, че това ще се компилира:
private IQueryable<T> Test<T>(IQueryable<T> temp1, IQueryable<T> temp2)
{
return temp1.Union(temp2); // compiles fine
}
Това обаче не стига до истинския ми въпрос, поради което методите за разширение не бяха разпознати в параметъра с общ тип. Това решение просто премахва "generic-ism" в критичното място на (както беше отбелязано, силно опростен) пример. Мисля, че както отбелязва един отговор, е вярно, че разграничението между IQueryable
и IQueryable<>
е важно.
За протокола опитах и:
private C<T> Test<C, T>(C<T> temp1, C<T> temp2) // The type parameter 'C' cannot be used with type arguments
{
return temp1.Union(temp2);
}
Това дава отбелязаната грешка на компилатора.
T
прилагаIQueryable
, а неIQueryable<T>
? - person Jon Hanna   schedule 03.12.2013