通用接口中的协变

2023-12-11

我想创建一个可排序的 observableCollection 所以我开始创建一个继承 observable 的类,并使用一些方法对其进行排序,然后我希望该类将索引保留到子类中,因此我创建了一个接口,该接口公开了我可以写入的索引属性,并且我约束了 T我的集合类是我的接口的,然后我希望能够从每个项目访问parentCollection,这里问题开始了,因为父集合的类型是通用的...... 我已经尝试了很多解决方案,我认为协方差或不变性是方法,但我无法让它工作......

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassLibrary1
{
    public class SortableCollection<T> : System.Collections.ObjectModel.ObservableCollection<T>, ISortableCollection<T> where T : ISortable<T>
    {
        public void Sort()
        {
            //We all know how to sort something
            throw new NotImplementedException();
        }

        protected override void InsertItem(int index, T item)
        {
            item.Index = index;
            item.ParentCollection = this;
            base.InsertItem(index, item);
        }
    }

    public interface ISortableCollection<T> : IList<T>
    {
        void Sort();
    }

    public interface ISortable<T>
    {
        Int32 Index { get; set; }
        ISortableCollection<T> ParentCollection { get; set; }
    }

    public class BaseClass : ISortable<BaseClass>
    {
        public int Index { get; set; }

        public ISortableCollection<BaseClass> ParentCollection { get; set; }
    }

    public class DerivedClass : BaseClass { }

    public class Controller
    {
        SortableCollection<BaseClass> MyBaseSortableList = new SortableCollection<BaseClass>();
        SortableCollection<DerivedClass> MyDerivedSortableList = new SortableCollection<DerivedClass>();

        public Controller()
        {
            //do things
        }
    }
}

这或多或少是设置。 我希望能够创建一个SortableCollection<DerivedClass>但类型不匹配...这是正确的方法吗?

确切的错误是

错误 1 ​​类型“ClassLibrary1.DerivedClass”不能用作泛型类型或方法中的类型参数“T”'ClassLibrary1.SortableCollection<T>'。没有从“ClassLibrary1.DerivedClass”到“ClassLibrary1.DerivedClass”的隐式引用转换'ClassLibrary1.ISortable<ClassLibrary1.DerivedClass>'。 c:\users\luigi.trabacchin\documents\visual studio 2013\Projects\ClassLibrary1\ClassLibrary1\Class1.cs 48 89 ClassLibrary1


问题是你的限制T is "T需要是一个I<T>“,并且您已经通过了DerivedClass for T, but DerivedClass不可转换为I<DerivedClass>,它可以转换为I<BaseClass>.

我不知道你想用这个约束来表示什么T be an I<T>。我确实知道人们经常使用此模式来尝试表示 C# 类型系统实际上并未实现的约束。有关详细信息,请参阅我关于该主题的文章:

http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx

我鼓励你大大简化事情;您似乎试图在类型系统中捕获太多内容。

之所以I<D>不可转换为I<B>是因为为了使方差发挥作用,接口必须标记为支持方差;标记T with out or in取决于您想要协变还是逆变。

然而,自从IList<T>是不变的,使派生接口协变或逆变是不合法的。考虑IEnumerable<T>相反,因为它是协变的T.

为了使接口具有协变性T它只需要使用T in output职位。List<T> uses T在输入和输出位置,因此它不能是协变或逆变的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通用接口中的协变 的相关文章

  • 将 void *user_data 转换为对象

    我该如何投射void something到标准 C 中的对象 具体来说我想投void userdata to std map
  • 如果图像包含特定颜色则

    是否有一种简单的方法来检查图像是否包含特定的 RGB 颜色 例如 Dim img As Image Image FromFile C image png If img contains color red toRGB then 我认为检查这
  • 增量决策树 C++ 实现

    有谁知道决策树分类器的增量实现吗 这样 当您将新实例添加到训练集中时 它可以根据现有决策树分类器以低计算量并尽可能快地生成最佳决策树分类器 换句话说 我有一个最优决策树分类器集A 其中命名为T 1 现在我想添加实例X to set A并找到
  • 在目标 VS 安装时,VSIX 扩展内部使用的 WPF-Log4Net 未输出日志

    当 Log4net 在 VSIX 扩展中使用并安装在另一个目标 VS 上时 它不会记录日志 我有一个 WPF 解决方案 我下载了 log4net dll 添加了 log4net config 并将 复制到输出目录 值设置为 始终复制 log
  • 为什么将 char 传递给函数会改变它在 c 中的值?

    我目前正在关注本作业簿 http www cs bham ac uk exr lectures opsys 10 11 lectures os dev pdf关于构建操作系统 我的目的是写一个64位内核 我已经在文本模式下加载 内核 代码并
  • Keyboard.Focus(item) 和 item.Focus() 有什么区别?

    在 WPF 中 有两种方法将焦点设置到元素 您可以调用输入元素的 Focus 方法 也可以使用输入元素作为参数调用 Keyboard Focus first way item Focus alternate way Keyboard Foc
  • 我要恢复我的记忆!我怎样才能真正处理一个控件?

    我正在制作一个应用程序 它创建大量的窗口控件 按钮和标签等 它们都是通过函数动态生成的 我遇到的问题是 当我删除控件并处置它们时 它们不会从内存中删除 void loadALoadOfStuff while tabControlToClea
  • 修剪 UIImage 边框

    这是我想要修剪的图像的示例 我想去掉图像周围的边框 在本例中是顶部和底部的黑条 我在Github上找到了一个库 CKImageAdditions https github com cmkilger CKImageAdditions 但是它似
  • 多维数组和指向指针的指针

    创建多维数组时char a 10 10 根据我的书 它说你必须使用类似于char a 10 将数组传递给函数 为什么必须这样指定长度 您不是只是将双指针传递给 with 并且该双指针不是已经指向分配的内存吗 那么为什么参数不能是char a
  • 当前的 .NET SDK 不支持面向 .NET 6.0。目标为 .NET 5.0 或更低版本,或者使用支持 .NET 6.0 的 .NET SDK 版本

    我知道这是一个重复的问题 但我已经尝试了所有提到的解决方案 但没有得到解决 我有一个 dotnet c 应用程序 当我运行该应用程序时 出现以下错误 当前的 NET SDK 不支持面向 NET 6 0 任何一个 目标为 NET 5 0 或更
  • 执行存储过程时 ExecuteNonQuery() 返回 -1

    我正在尝试在 Visual Studio 中执行存储过程 下面给出 CREATE PROCEDURE dbo addStudent stuName varchar 50 address varchar 100 tel varchar 15
  • 如何在 Visual Studio 2010 Express 中引用 system.drawing?

    我对此有点陌生 我的印象是要绘制我创建的矩形 我需要使用 system drawing graphics 问题是 我收到错误 命名空间 System 中不存在类型或命名空间名称 drawing 您是否缺少程序集引用 当我右键单击解决方案资源
  • 为什么必须通过 this 指针访问模板基类成员?

    如果下面的类不是模板 我可以简单地拥有x in the derived班级 但是 通过下面的代码 我have to use this gt x Why template
  • #define 内存地址声明

    这个 define 语句有什么作用 它用于定义内存地址 但我不明白 uint32 t 部分 define GPxDAT uint32 t 0x6FC0 通常用于访问映射到地址空间的硬件寄存器 或者一些特定的内存地址 硬件寄存器应定义为vol
  • 将 System.Array 从 .Net 编组到 vb6

    我有一个 Net 组件 它有一个 COM 可见类 该类具有返回 System Array 的方法 它实际上返回一个字符串数组 但返回类型声明为 System Array 不要问我 为什么 我知道我可以将返回类型声明为 string 这样就可
  • Gridview 错误:对 Bind 的调用格式不正确

    我有以下 gridview 代码
  • 是否可以编写一个在另一个 Windows 应用程序中选择文本时收到通知的 Windows 应用程序?

    我很好奇是否可以编写一个程序来监视我的文本选择 一种可能的用途是编写一个与编辑器 IDE 无关的代码格式化程序 应用程序 服务 P 启动并以某种方式挂接到窗口中 以便在任何窗口中选择文本时收到通知 启动其他一些应用程序 A 用户选择 A 中
  • 用于测试对象类型的通用 Swift 函数

    我正在尝试编写一个函数 该函数接受一个对象和一个类型作为参数 并返回一个布尔值 指示该对象是否属于给定类型 似乎没有 Type 类型 所以我不知道如何做到这一点 我能做的最好的就是 func objectIsType
  • DataGridView 捕获用户行选择

    我在处理选择时遇到问题DataGridView 我的网格视图包含一个金额列 表单上有一个文本框 应显示所选网格视图行的总数 因此 我需要在用户选择 取消选择 gridview 行时捕获事件并相应地计算 添加 减去 金额 我找到了两种方法 使
  • C#:如何处理乱序 TCP 数据包?

    请有人解释一下如何处理乱序数据包 我使用原始套接字来捕获数据包 并在数据包到来时解析它们 但其中一些数据包的顺序错误 例如 ID 标志 16390 PSH ACK 16535 PSH ACK 16638 确认 16640 PSH ACK 1

随机推荐

  • 如果在范围内找到单个单元格值,则删除整行

    我正在处理每个多个站点记录 31 天数据的每日数据 我需要一个 VBA 代码来删除闰年日 我有一个记录数据日期的列表和一个我想要删除的非闰年的年份列表 为了删除额外的 30 和 31 天 我使用了以下基本代码 Dim lastrow i A
  • Excel 超链接 - 跳转到单元格并滚动窗口

    我正在使用 Excel 我想创建一个从页面顶部到页面上另一个位置的超链接 我在顶部的一个框中输入 然后右键链接并向下转到hyper link在下拉菜单中 我单击它并选择 在此工作簿中 的选项卡 并将其更改为我想要的位置 所以这一切都很好 但
  • 打字稿中的 useContext 和 useReducer

    我是新来的打字稿我正在实现react useContext 和useReducer 我正在遵循教程 但出现错误Parameter action implicitly has an any type 在我的减速器功能中 减速机功能 funct
  • 十进制数的正则表达式

    有人可以帮助我使用正则表达式吗 基本上 我想要一个与十进制数字匹配的正则表达式 允许的类型 12 1 3234 0 3423434 23423 12 不允许的类型 0012 12 324 12 01 2332 12 121212 提前感谢您
  • 如何使用 pip 安装 numpy

    我正在尝试安装numpy在我的 Mac 上 我目前使用 OS X 10 7 3 和 Python 版本 2 7 根据which python I tried pip install numpy在命令行中显示 找不到任何满足 numpy 要求
  • 在java中,JFrame是重量级组件还是轻量级组件?

    我知道 Swing 被认为是轻量级的 因为它完全用 Java 实现 无需调用本机操作系统来绘制图形用户界面组件 另一方面 AWT 抽象窗口工具包 是重量级工具包 因为它仅调用操作系统来生成其 GUI 组件 但听说Swing还是基于AWT的
  • 如何强制 .NET 3.5 应用程序在 .NET 4.5 运行时运行?

    我正在尝试实施此处描述的解决方案 我可以在面向 NET 3 5 SP1 时使用 NET 4 功能吗 当 NET 3 5 应用程序在 NET 4 0 上运行时 它可以正常工作 但是 在 NET 4 5 上 该应用程序在 NET 3 5 环境中
  • iOS:初始界面方向 [UIInterfaceOrientation] 在 plist 中被忽略

    我正在尝试将我的应用程序的初始方向设置为 UI界面方向横向左 我无法得到 Initial interface orientation UIInterfaceOrientation 覆盖数组中的第一项 Supported interface
  • 为什么我的 ViewScoped bean 无法在 h:commandButton 中生存?

    在 JBoss AS 7 1 0 Final 上部署 我有一个非常简单的测试应用程序 直到前几天它都按预期工作 著名的遗言 并且不再做最基本的事情 即设置输入组件的值并在操作组件中使用它 我已经将这件事剥离到基础知识 但无法弄清楚发生了什么
  • android 手机启动时启动 Activity

    我试图在手机启动时启动活动 但整个程序没有运行 程序中没有错误 请参阅下面的编码 或此处http pastebin com BKaE4AaU 自动启动 java import android content BroadcastReceive
  • 使用 LINQ 自定义排序

    看来我错过了一些微不足道的事情 无论如何 事情是这样的 var order new 1 3 2 var foos new new Foo Id 1 new Foo Id 2 new Foo Id 3 如何使用 Linq 按顺序数组对 foo
  • Angular 4.0 http put 请求

    我编写了一个函数来发送 http put 请求来更新一些数据 但它说它没有收到任何数据 updateHuman human Human const url this url human id const data JSON stringif
  • 如何使用访问权限和密钥来访问 Google Cloud Storage

    我拥有 Google Cloud Storage 的访问权限和密钥 并且我想使用这些凭据实例化客户端 我一直在查看教程并遇到了这个示例 public class QuickstartSample public static void mai
  • 如何在 C 预处理器中生成唯一值?

    我正在编写一堆相关的预处理器宏 其中一个生成标签 另一个宏则跳转到该标签 我以这种方式使用它们 MAKE FUNNY JUMPING LOOP MAKE LABEL MAKE LABEL 我需要某种方法来生成独特的标签 每个内部标签一个MA
  • 如何注册 OMX 核心以添加新解码器

    我指的是帖子 Android 如何将解码器集成到多媒体框架 接下来我注册了我的新解码器 Android 目前不支持 media codecs xml 上述帖子的步骤 2 需要我执行OMX核心注册 但是 由于我对这个主题非常陌生 所以我无法遵
  • 为什么我的 onclick 事件没有在 Firefox 中注册?

    我有一个列表项onclick事件 它可以在 Chrome 和 Internet Explorer 中运行 但不能在 Firefox 中运行 有什么建议么 li test test br li 这对我来说在 Firefox 中工作得很好 检查
  • PyQt 是否有相当于 Toastr 的工具?

    我正在开发我的第一个 PyQt 项目 我想想出一种方法 在用户完成任务时向他们提供成功或错误消息 过去 我用过 JavascriptToastr我很好奇 Python 应用程序是否有类似的东西 我考虑过在 PyQt 中使用 QDialog
  • ld:在带有 gcc/clang -static 标志的 OSX 10.6 上找不到 -lcrt0.o 的库

    当我尝试构建以下程序时 include
  • 使用 SWR 从内部 API 路由获取客户端数据

    我正在尝试在 Next js 应用程序中获取 API 路由中的数据 但它不起作用 这是我在 API 路径上获取数据的代码 import nc from next connect const jobHandler nc jobHandler
  • 通用接口中的协变

    我想创建一个可排序的 observableCollection 所以我开始创建一个继承 observable 的类 并使用一些方法对其进行排序 然后我希望该类将索引保留到子类中 因此我创建了一个接口 该接口公开了我可以写入的索引属性 并且我