c # возвращает тип интерфейса из метода - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть 2 интерфейса, определенных как

public interface IEnumerableDisposable<out T> : IEnumerable<T>, IDisposable
{
}

public interface IApiCollection
{
    IEnumerableDisposable<TItem> GetItems<TItem>();
}

и метод, который должен возвращать первый тип интерфейса, подобный этому

public IEnumerableDisposable<TItem> GetItems<TItem>()

, где TItem может иметь тип Foo или типБар

Вопрос, как мне привести тип возвращаемого значения к IEnumerableDisposable?

Насколько я понимаю, мне нужен класс

public class EnumandDisposeFoo : IEnumerableDisposable<Foo>
{
}

и установить этот класс внутри моего метода.как бы мне затем привести тип обратно к его общей форме?

Любая помощь будет принята с благодарностью

  var foo = new EnumandDisposeFoo(_pagedApi);

           var fooitems  = foo.GetEnumerator();

             return foo;  --> errors with

    Cannot implicitly convert type 'ApiCollection.Implementation.EnumandDisposeFoo' to 'ApiCollection.IEnumerableDisposable<TItem>'. An explicit conversion exists (are you missing a cast?

1 Ответ

0 голосов
/ 21 декабря 2018

Возможно, ваш код выглядит похожим?Я попытался извлечь его из предоставленного сообщения об ошибке ...

public IEnumerableDisposable<TItem> GetItems<TItem>()
{
    var foo = new EnumandDisposeFoo(_pagedApi);
    // var fooitems  = foo.GetEnumerator(); // not used and is in fact of type `IEnumerator<Foo>`
    return foo;
}

Если да, EnumandDisposeFoo реализует IEnumerableDisposable<T> при указании типа элемента T как Foo.На данный момент это больше не является общим .Попытка привести ( неявно ) к универсальному IEnumerableDisposable<TItem> завершится неудачей, если вы не предоставите переопределение для этого конкретного неявного приведения.

Я сомневаюсь, что вы хотите этого.

Либовы меняете EnumandDisposeFoo на универсальную реализацию:

public class EnumandDisposeFoo<TItem> : IEnumerableDisposable<TItem> { }

или ограничиваете свой метод, возвращая (неуниверсальный) IEnumerableDisposable<Foo>.

Компилятор не знает, какого родатипа вы хотите вернуть, таким образом, нет ошибки во время компиляции.Вызов вашего метода с GetItems<Foo>(), вероятно, будет успешным.Но вызов вашего метода с любым другим типом, кроме Foo для TItem, попытается выполнить неявное приведение во время выполнения, которое может или не может дать сбой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...