Как передать дочерний элемент родового класса с конкретной реализацией методу с родительским параметром? [Дубликат]

Возможно, вы можете иметь дело с библиотекой отладки с функцией debug.getinfo ()

 , если debug.getinfo (1) .what == "main" then - Main execution  end  

Для получения дополнительной информации см. справочное руководство.

4
задан Floris Velleman 29 September 2013 в 11:48
поделиться

3 ответа

Похоже, что .NET Framework 4.0 поддерживает ковариацию в общих интерфейсах и делегатах. Итак, мне удалось скомпилировать код, добавив общий интерфейс.

public interface IInterface
{
    ...
}

public class Class1 : IInterface
{
    ...
}

public interface IBase<out T> where T: IInterface
{
    // Need to add out keyword for covariance.
}

public class Base<T> : IBase<T> where T : IInterface
{
    ...
}

public class Class2<T> : Base<T> where T : IInterface
{
    ...
}

.
.
.

public SomeMethod()
{
    List<IBase<IInterface>> list = new List<IBase<IInterface>>();
    Class2<Class1> item = new Class2<Class1>();
    list.Add(item); // No compile time error here.
}
3
ответ дан Bumbala 16 August 2018 в 10:12
поделиться

Нет, это не является законным в C #. C # 4 и выше поддерживают ковариацию и контравариантность общих интерфейсов и общих делегатов, когда они построены с использованием ссылочных типов. Например, IEnumerable<T> является ковариантным, поэтому вы можете сказать:

List<Giraffe> giraffes = new List<Giraffe>() { ... };
IEnumerable<Animal> animals = giraffes;

, но не

List<Animal> animals = giraffes;

. Поскольку в список животных может быть включен тигр, но список жирафов не может.

Сделайте веб-поиск по ковариации и контравариантности на C #, и вы найдете много статей об этом.

6
ответ дан Eric Lippert 16 August 2018 в 10:12
поделиться
  • 1
    Из того, что я прочитал по следующей ссылке: msdn.microsoft.com/en-us/library/dd799517.aspx Только интерфейсы и делегаты могут быть ковариантными. Похоже, мне нужно найти другое решение. Спасибо, в любом случае. – Bumbala 29 September 2013 в 16:51

вы не можете использовать generic типа this.list, это IInterface, но вы пытаетесь добавить Class1 в список. Это должно быть следующим:

        List<Base<Class1>> list = new List<Base<Class1>>();
        Class2<Class1> item = new Class2<Class1>();
        list.Add(item); 
0
ответ дан Thilina H 16 August 2018 в 10:12
поделиться
  • 1
    Список является лишь примером. Рассмотрим это: public void SomeMethod () {AnotherMethod (новый Class2 & lt; Class1 & gt; ()); } public void AnotherMethod (Base & lt; IInterface & gt; obj) {...} – Bumbala 29 September 2013 в 12:12
Другие вопросы по тегам:

Похожие вопросы: