Одна функция, реализующая универсальный и неуниверсальный интерфейс - PullRequest
0 голосов
/ 29 октября 2010

Допустим, у меня есть класс, который реализует универсальный интерфейс открытый интерфейс IItem {}

public interface IStuff<out TItem> where TItem : IItem
{
    TItem FavoriteItem { get; }
}

public class MyStuff<TItem> : IStuff<TItem> where TItem : IItem
{
    public TItem FavoriteItem
    {
        get { throw new NotImplementedException(); }
    }
}

У меня есть также один неуниверсальный интерфейс

public interface IFavoriteItem
{
    IItem FavoriteItem { get; }
}

Я бы хотел, чтобы класс MyStuff реализовывал этот интерфейс IFavoriteItem. Поскольку TItem реализует IItem, мне кажется, что свойство public TItem FavoriteItem уже реализует IFavoriteItem.

Но компилятор так не думает, и он хочет, чтобы я объявил отдельный IItem IFavoriteItem.FavoriteItem в MyClass. Почему это так? Разве c # ковариация не должна играть здесь и решить мою проблему?

Спасибо

1 Ответ

3 голосов
/ 29 октября 2010

Причина этого в том, что FavoriteItem из IFavoriteItem не может быть IItem, где на IFavoriteItem это должно быть IItem. Единственный способ решить эту проблему:

IItem IFavoriteItem.FavoriteItem
{
    get { return FavoriteItem; }
}

Это просто вызовет вашу реализацию TItem.

Хороший пример того, как это часто используется, - реализация IEnumerable<>. Они часто выглядят так:

public class MyEnumerable : IEnumerable<T>
{
    public IEnumerator<T> GetEnumerator()
    {
        throw new NotImplementedException();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...