C# 如何向上转换IEnumerable类型的对象<;Foo>;到IEnumerable<;IFoo>;是否作为对象传递给函数?
我正在尝试将作为对象传递的参数(这是IEnumerable类型对象的向上转换)向上转换到IEnumerable,其中Foo实现了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
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);