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