我创建了一个接口(interface)和类如下:
public interface IRecord
{
}
public class Person : IRecord
{
}
public class Company : IRecord
{
}
public class Contact : IRecord
{
}
public class Table<T> where T : IRecord
{
}
我还有一个静态类来管理表格。我希望能够根据 switch 语句获取特定表:
public class DataBase
{
public static Table<Person> Persons { get; set; }
public static Table<Contact> Contacts { get; set; }
public static Table<Company> Companies { get; set; }
public static Table<IRecord> GetTable(eDataType type)
{
switch (type)
{
case eDataType.company:
return Companies;
case eDataType.contact:
return Contacts;
case eDataType.person:
return Persons;
}
return null;
}
}
然而,返回行都抛出编译错误:
Cannot implicitly convert type 'Table<Company>' to 'Table<IRecord>'
我可以修改我的代码以返回正确的表格吗?
最佳答案
你不能那样做,因为 Table<Company>
不是 Table<IRecord>
, 即使 Company
工具 IRecord
.那是因为Table<T>
不是 covariant (无论如何,类不能是协变的,只有接口(interface)和委托(delegate)可以)。
为了解释原因,我们假设您的 Table<T>
类有一个 Insert(T record)
方法;如果你能治疗 Table<Company>
作为Table<IRecord>
, 它会允许你插入一个 Person
或 Contact
在表中,这显然是不正确的。
现在的问题是,您打算如何使用返回的表?如果你只是想阅读它,你可以像这样定义一个协变接口(interface):
public interface ITable<out T> where T : IRecord
{
}
然后制作Table<T>
实现这个接口(interface),改变GetTable
返回 ITable<IRecord>
而不是 Table<IRecord>
.
注意接口(interface)只能有T
在输出位置(例如,它不能有一个方法将 T
作为参数),否则不允许协变。
关于c# - 需要将泛型转换为其接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25777155/