返回IEnumerable <imyinterface>将无法正常工作 - 必须使用IEnumerable <myobj>而不是</myobj> </imyinterface>

时间:2012-09-22 23:21:19

标签: c# .net

我正在尝试返回IEnumerable<IMyInterface>。我有一个类MyClass:IMyInterface,我从一个函数返回。

IEnumerable<IMyInterface> test() {
    tmpList = new List<MyClass>();
    tmp1 = new MyClass();
    tmp2 = new MyClass();
    tmpList.Add(tmp1);
    tmpList.Add(tmp2);
    return tmpList;
}

编译器不会允许,这对我来说似乎很奇怪,因为MyClass:MyInterface。编译器会在'cannot implicitly convert type System.Collections.Generic.IEnumerable<MyClass> to System.Collections.Generic.IEnumerable<IMyInterface. An explicit conversion exists. Are you missing a cast?'

的行中给出错误

如果没有在运行时抛出异常,我无法执行return (IEnumerable<IMyInterface>)tmp。我错过了什么?我希望返回IEnumerable接口应该可以正常工作。

2 个答案:

答案 0 :(得分:5)

你应该这样做:

IEnumerable<IMyInterface> test() {
    tmpList = new List<IMyInterface>();  // this is the important bit
    tmp1 = new MyClass();
    tmp2 = new MyClass();
    tmpList.Add(tmp1);
    tmpList.Add(tmp2);
    return tmpList;
}

或者,你可以这样做:

return tmpList.Cast<IMyInterface>(); // requires using System.Linq in usings

答案 1 :(得分:2)

使用yield return代替return。这会将一个简单的对象转换为对象的枚举!

IEnumerable<IMyInterface> test() {
    yield return new MyClass();
    yield return new MyClass();
    yield return new MyClass();
}

创建实现接口的三个对象的枚举。


编辑:

或者更改方法的返回类型以返回单个项目。

IMyInterface test() {
    return new MyClass();
}