Вопрос.net 4 дженериков
У меня есть следующая структура класса:
public class A : AInterface { }
public interface AInterface { }
public class B<T> : BInterface<T> where T : AInterface
{
public T Element { get; set; }
}
public interface BInterface<T> where T : AInterface
{
T Element { get; set; }
}
public class Y : B<A> { }
public class Z<T> where T : BInterface<AInterface> {}
public class Test
{
public Test()
{
Z<Y> z = new Z<Y>();
}
}
Это дает мне следующую компиляцию erorr в C# 4.0. Тип "Test.Y" нельзя использовать в качестве параметра типа "T" в универсальном типе или методе "Test.Z". Не существует неявного преобразования ссылок из Test.Y в Test.BInterface.
Я думаю, ковариация в дженерики должны сделать эту работу? Любая помощь будет оценена.
2 ответа
Общие параметры в интерфейсах по умолчанию инвариантны, вам нужно явно указать, хотите ли вы, чтобы конкретный общий параметр был ковариантным или контравариантным. В основном, в вашем примере вам нужно добавить ключевое слово "out" в объявление интерфейса:
public interface BInterface<out T> where T : AInterface { }
Вы можете найти больше информации о создании вариантов интерфейсов в MSDN: Создание вариантов универсальных интерфейсов (C# и Visual Basic).
Я думаю, что вам не хватает out
ключевое слово. Попробуйте добавить его в следующие строки:
public interface BInterface<out T> where T : AInterface { }
public class Z<out T> where T : BInterface<AInterface> {}
Я не уверен, если это необходимо в обоих местах, хотя.