c# - 通用接口(interface)的非通用实现

标签 c# generics

我有以下一组 3 个接口(interface)和这些接口(interface)的 3 个实现。接口(interface)是用泛型定义的,最顶层的接口(interface)需要它的参数向下扩展第二个接口(interface);与第三个接口(interface)的第二个接口(interface)相同。这些类没有通用参数,而是使用特定类实现接口(interface),每个类都满足接口(interface)的要求。

namespace GenericsIssueExample
{
    interface IGroup<Row> where Row : IRow<IEntry>
    {
        Row[] Rows {
            get;
            set;
        }
    }

    interface IRow<Entry> where Entry : IEntry
    {
        Entry[] Entries {
            get;
            set;
        }
    }

    interface IEntry
    {
        int Value {
            get;
            set;
        }
    }

    class ExampleGroup : IGroup<ExampleRow>
    {
        private ExampleRow[] rows;

        public ExampleRow[] Rows {
            get { return rows; }
            set { rows = value; }
        }
    }

    class ExampleRow : IRow<ExampleEntry>
    {
        private ExampleEntry[] entries;

        public ExampleEntry[] Entries {
            get { return entries; }
            set { entries = value; }
        }
    }

    class ExampleEntry : IEntry
    {
        private int val = 0;

        public int Value {
            get { return val; }
            set { val = value; }
        }
    }
}

当我尝试编译上面的代码时,出现以下编译错误:

The type 'GenericsIssueExample.ExampleRow' cannot be used as type parameter 'Row' in the generic type or method 'GenericsIssueExample.IGroup<Row>'. There is no implicit reference conversion from 'GenericsIssueExample.ExampleRow' to 'GenericsIssueExample.IRow<GenericsIssueExample.IEntry>'.

这个错误在第27行,也就是ExampleGroup的定义:

class ExampleGroup : IGroup<ExampleRow>

我不明白为什么会这样,因为 ExampleRow执行IRow<IEntry> . (IRow<ExampleEntry>)。

我将如何更正上述代码以解决该错误?

最佳答案

仅仅因为ExampleEntry可以隐式转换为 IEntry并不意味着 IRow<ExampleEntry>可以转换为 IRow<IEntry> .如果IRow就其通用参数而言是协变的,那么是的,这是可能的,但它不是现在的样子,因此隐式转换是不可能的。

如果你可以隐式转换 IRow<ExampleEntry>IRow<IEntry>那么你可以设置 Entries IEntry 数组的属性不是 ExampleRow 的类型.

关于c# - 通用接口(interface)的非通用实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26997923/

相关文章:

c# - 输入字符串的格式不正确 #2

java - 为什么 getItem(position) 应该在泛型类(即 Custom ArrayAdapter<T>)内进行转换?

c# - 为多个客户端调用设置 WCF 服务

c# - 如何从 flowlayoutpanel 更改控件的属性?

java - 警告 ArrayList 是原始类型。应参数化对泛型类型 ArrayList<E> 的引用

java - S 扩展 S 的 ArrayList 是语言中有用的构造还是只是语法副作用

c# - 从非泛型类覆盖抽象泛型方法

c# - 恢复一个 "lost"类型的参数

C# 从文件名中删除无效字符

c# - !(ReferenceEquals()) 与 Entity Framework 4 中的 !=