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