c#从方法返回接口类型
我有两个这样定义的接口c#从方法返回接口类型,c#,generics,interface,C#,Generics,Interface,我有两个这样定义的接口 public interface IEnumerableDisposable<out T> : IEnumerable<T>, IDisposable { } public interface IApiCollection { IEnumerableDisposable<TItem> GetItems<TItem>(); } public IEnumerableDisposable<TItem> Ge
public interface IEnumerableDisposable<out T> : IEnumerable<T>, IDisposable
{
}
public interface IApiCollection
{
IEnumerableDisposable<TItem> GetItems<TItem>();
}
public IEnumerableDisposable<TItem> GetItems<TItem>()
公共接口IEnumerableDisposable:IEnumerable,IDisposable
{
}
公共接口IApiCollection
{
IEnumerableDisposable GetItems();
}
以及一个需要像这样返回第一个接口类型的方法
public interface IEnumerableDisposable<out T> : IEnumerable<T>, IDisposable
{
}
public interface IApiCollection
{
IEnumerableDisposable<TItem> GetItems<TItem>();
}
public IEnumerableDisposable<TItem> GetItems<TItem>()
public IEnumerableDisposable GetItems()
其中,滴度可以是Foo型或Bar型
问题:如何将返回类型强制转换为IEnumerableDisposable
我的理解是我需要上课
public class EnumandDisposeFoo : IEnumerableDisposable<Foo>
{
}
公共类EnumandDisposeFo:IEnumerableDisposable
{
}
在我的方法中安装这个类。然后如何将类型转换回其泛型形式
任何帮助都将不胜感激
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?
var foo=new enumandisposefoo(_pagedApi);
var footems=foo.GetEnumerator();
返回foo;-->错误
无法将类型“ApiCollection.Implementation.EnumandDisposeFo”隐式转换为“ApiCollection.IEnumerableDisposable”。存在显式转换(是否缺少强制转换?
您的代码看起来是否相似?
我试图从提供的错误消息中导出它
public IEnumerableDisposable GetItems()
{
var foo=新的EnumandDisposeFoo(_pagedApi);
//var fooitems=foo.GetEnumerator();//未使用,实际上是'IEnumerator'类型`
返回foo;
}
如果是,EnumandDisposeFo
实现IEnumerableDisposable
,同时将元素类型T
指定为Foo
。此时它不再是泛型的。尝试强制转换(隐式)除非为该特定隐式强制转换提供重写,否则对泛型IEnumerableDisposable
的调用将失败
我怀疑你想要那个
您可以将EnumandDisposeFo
更改为通用实现:
公共类EnumandDisposeFo:IEnumerableDisposable{}
或者将方法限制为返回(非泛型)IEnumerableDisposable
编译器不知道要返回哪种类型,因此在编译时没有错误。
使用GetItems()
调用方法可能会成功。
但是使用
Foo
以外的任何类型调用TItem
的方法将在运行时尝试隐式强制转换,这可能会失败,也可能不会失败。您不需要“将类型强制转换回其泛型形式”只需返回您的EnumandDisposeFo
实例;它已经实现了您要返回的接口。您不必强制转换为通用形式-您根本不需要强制转换,EnumandDisposeFo
应该与IEnumerableDisposable
的赋值兼容。非常感谢@RobertHarvey和Netmage,我想我在正确的轨道上。请查看我的返回类型不正确的行。“其中TItem可以是Foo类型或Bar类型”…由…实现者或调用者决定?您应该返回enumandispose
其中T
是Foo
。