c#从方法

时间:2018-12-20 23:18:27

标签: c# generics interface

我有2个这样定义的接口

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

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

以及需要返回此类第一个接口类型的方法

public IEnumerableDisposable<TItem> GetItems<TItem>()

其中TItem可以是Foo或Bar

问题我如何将返回类型转换为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 :(得分:1)

您的代码可能看起来相似吗? 我试图从提供的错误消息中派生它...

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的方法将在运行时尝试隐式强制转换,这可能会也可能不会失败。