Есть несколько опций, которые вы должны попробовать:
Skype
, вы должны закрыть и выйти из него. Из-за этого получается port 80
. (Поэтому убедитесь, что Skype не работает в фоновом режиме) SQL Server
, вам нужно остановить эти службы в службах Windows. MySQL Workbench
, вы должны сделать то же самое. XAMPP control panel
и запустите от имени администратора. Это - ковариантность и будет зафиксировано в C# 4.0/.NET 4.0. На данный момент универсальная опция является лучшим ответом (для IEnumerable<T>
- нет IList<T>
и т.д.).
Но в общем методе, необходимо думать с точки зрения T
. Вы могли также использовать Cast<T>
или OfType<T>
с LINQ для достижения чего-то подобного.
В C# 3.0 можно использовать метод расширения "Броска". Если Вы импортируете Систему. Linq и затем используют этот код:
public void AddRange2<T>(IEnumerable<T> foos) where T : Foo
{
m_Foos.AddRange (foos.Cast<Foo>());
}
Затем это должно работать на Вас.
Существует обходное решение с дополнительным методом:
public static IEnumerable<TBase> ToBaseEnumerable<TBase, TDerived>( this IEnumerable<TDerived> items ) where TDerived : TBase {
foreach( var item in items ) {
yield return item;
}
}
...
IEnumerable<Employee> employees = GetEmployees(); //Emplyoee derives from Person
DoSomethingWithPersons( employees.ToBaseEnumerable<Person, Employee>() );
но" <Человек, Сотрудник>" является немного неловким:/.
Решение приведения, конечно, могло генерировать исключения приведения классов . Человек, который опубликовал работу с перечисляемыми расширениями, сказал, что это было неудобно. Я придумал решение, которое вдвое менее неудобно, не знаю, буду ли я его использовать:
public static class UpTo<T>
{
public static IEnumerable<T> From<F>(IEnumerable<F> source) where F:T
{
// this cast is guaranteed to work
return source.Select(f => (T) f);
}
}
Использование:
IEnumerable mammals = UpTo