Вопрос.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> {}

Я не уверен, если это необходимо в обоих местах, хотя.

Другие вопросы по тегам