我遇到意外问题。C# - 将变体类型的子类转换为父类
我想用特型演员子类,以他的父类与通用类型,但是编译器不希望这种事情发生......
这里是我的父类:
public abstract class DataSource<T>
{
// Abstract methods and constructor
}
一个子类:
public class XlsxDataSource : DataSource<Row>
{
// Overriden methods and constructor
}
和代码给错误:
XlsxDataSource dataSource = new XlsxDataSource();
var dataSources = new Dictionary<long, DataSource<Object>>();
dataSources[dataSource.id] = (DataSource<Object>) dataSource;
正如你所看到的,我有一个Dictionary
可以包含许多DataSources
而不管子类型。
但最后一行是给接下来的编译错误:
Cannot convert type 'EDS.Models.XlsxDataSource' to 'EDS.Models.DataSource<object>'
而且我不知道为什么,因为XlsxDataSource
是从DataSource
一个孩子,在XlsxDataSource
类型是明确至极显然是实现System.Object
。
Edit
在我的情况下,co-variant接口不起作用。
这是我修改后的代码:
public interface IDataSource<T, in T1>
{
List<T> GetAllRows();
List<Object> GetValues(T1 row);
}
抽象类:
public abstract class DataSource<T, T1> : IDataSource<T, T1>
{
public abstract List<T> GetAllRows();
public abstract List<Object> GetValues(T1 row);
}
最后少派生类:
public class XlsxDataSource : DataSource<Row, Row>, IDataSource<Row, Row>
{
public abstract List<Row> GetAllRows();
public abstract List<Object> GetValues(Row row);
}
这里是铸造:
IDataSource<Object, Object> datasource = (IDataSource<Object, Object>) new XlsxDataSource();
但投XlsxDataSource
到IDataSource
对象造成的InvalidCastException
:
Unable to cast object of type 'EDS.Models.XlsxDataSource' to type 'EDS.Models.IDataSource`2[System.Object,System.Object]'.
这是因为它不是'DataSource
但我在我的'DataSource'类中有一个通用构造函数,所以没有多余的代码,这对于一个接口是不可能的。 –
你仍然可以在接口和子类之间有一个抽象类。只有在使用接口引用时,协变才有效。 https://msdn.microsoft.com/en-us/library/dd997386.aspx – juharr