c# - 需要将泛型转换为其接口(interface)

标签 c# generics interface

我创建了一个接口(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> , 它会允许你插入一个 PersonContact在表中,这显然是不正确的。

现在的问题是,您打算如何使用返回的表?如果你只是想阅读它,你可以像这样定义一个协变接口(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/

相关文章:

c# - 替换 DocumentDB 中的文档不保存更改

c# - 在抛出错误之前尝试运行任务 n 次

c# - 关于C#接口(interface)的问题

java - 为 SVN 和 CVS 提供通用接口(interface)

一个列表中的 C# 不同类对象

c# - Asp.net mvc identity SecurityStamp 无处不在注销

c# - WP7开发,从代码改变Image控件的大小

java - 具有多个类的上限 - Java 泛型

java - 我无法在 Java 中创建泛型数组类型的原因是什么?

c# - 如何正确使用 C# 泛型中的多重限制?