Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何向上转换IEnumerable类型的对象<;Foo>;到IEnumerable<;IFoo>;是否作为对象传递给函数?_C#_Generics_Casting - Fatal编程技术网

C# 如何向上转换IEnumerable类型的对象<;Foo>;到IEnumerable<;IFoo>;是否作为对象传递给函数?

C# 如何向上转换IEnumerable类型的对象<;Foo>;到IEnumerable<;IFoo>;是否作为对象传递给函数?,c#,generics,casting,C#,Generics,Casting,我正在尝试将作为对象传递的参数(这是IEnumerable类型对象的向上转换)向上转换到IEnumerable,其中Foo实现了IFoo 下面是我想做的一个例子,但它不起作用 public void F(object o) { //I know the object o is of type IEnumerable<Foo> where Foo implements IFoo IEnumerable<IFoo> ifoos = (IEnumerable&l

我正在尝试将作为对象传递的参数(这是IEnumerable类型对象的向上转换)向上转换到IEnumerable,其中Foo实现了IFoo

下面是我想做的一个例子,但它不起作用

public void F(object o)
{
    //I know the object o is of type IEnumerable<Foo> where Foo implements IFoo
    IEnumerable<IFoo> ifoos = (IEnumerable<IFoo>) o);
}
public void F(对象o)
{
//我知道对象o的类型是IEnumerable,其中Foo实现了IFoo
IEnumerable ifoos=(IEnumerable)o);
}
附近有工作吗?我不想使函数F Foo特定,但我无法将其转换到接口,除非我这样做:

IEnumerable<IFoo> ifoos = (IEnumerable<Foo>) o).Select( f => (IFoo) f);
IEnumerable ifoos=(IEnumerable)o)。选择(f=>(IFoo)f);
谢谢


Giuseppe

在.NET4.0之前,您不能-
IEnumerable
在.NET4.0之前是不变的

使用.NET4.0,您发布的代码可以正常工作

在.NET 3.5中,您可以使用
可枚举.Cast

public void F(object o)
{
    IEnumerable<IFoo> ifoos = ((IEnumerable) o).Cast<IFoo>();
}

双重强制转换有点尴尬,但它是有效的…

通用方法可以接受吗

interface IFoo { }
class Foo : IFoo { }
static void F<T>(IEnumerable<T> data) where T : IFoo
{ 
    foreach(T item in data) {
       // compiler knows that `item` is an `IFoo` etc
    }
}

...
List<Foo> foos = new List<Foo>();
F(foos);
接口IFoo{}
类Foo:IFoo{}
静态void F(IEnumerable数据),其中T:IFoo
{ 
foreach(数据中的T项){
//编译器知道'item'是'IFoo'等
}
}
...
List foos=新列表();
F(foos);

否则;请等到.NET 4.0/C#4.0/VS2010。

有关.NET 4:中协方差/逆变的更多信息以及底部表格中的相关主题。或者通过早期访问第二版C#深入阅读第13章:)()快速回复,点击此处谢谢!抱歉,这应该是“购买”而不是“显然:”)如果我为scratch创建函数,它会这样做,但我正在调整现有函数的主体,以便它可以处理实现IFoo的其他类型。
interface IFoo { }
class Foo : IFoo { }
static void F<T>(IEnumerable<T> data) where T : IFoo
{ 
    foreach(T item in data) {
       // compiler knows that `item` is an `IFoo` etc
    }
}

...
List<Foo> foos = new List<Foo>();
F(foos);