C# 泛型继承和协变第 2 部分

2023-11-24

这是我的原始线程:C# 泛型继承和协变

仅在我的只读界面上,我希望继承起作用。

public delegate Boolean EnumerateItemsDelegate<out ItemType>(ItemType item);

public interface IReadOnlyCollection<out ItemType>
{
    Boolean ContainsItem(ItemType item);
    Array CopyToArray();
    void EnumerateItems(EnumerateItemsDelegate<ItemType> enumerateDelegate);

    UInt32 Count { get; }
    UInt32 Capacity { get; }
}

像这样除了编译的地方:-p

这就是我想要的工作:

IReadOnlyCollection<String> s;
IReadOnlyCollection<Object> o = s;

这个问题好像没有什么问题,所以我就编几个问题来回答一下。

什么是协变转换?

假设我们有一些类型Fruit and Apple and Banana具有明显的关系;Apple是一种Fruit, 等等。

协变转换是一种类型参数的可转换性意味着泛型类型的可转换性的转换。如果Apple可转换为Fruit, and Bowl<Apple>可转换为Bowl<Fruit>, then Bowl<T>T 中是协变的。


什么是逆变转换?

逆变转换是协变转换,reverses方向而不是保存 it. If Eater<Fruit>可转换为Eater<Apple> then Eater<T>在 T 中是逆变的。


如何将接口或委托的类型参数标记为协变或逆变?

协变类型参数已标记out并标记逆变类型参数in.

这是为了便于记忆:协变接口通常使类型参数出现在输出位置,而逆变接口通常使类型参数出现在输入位置。


String可转换为Object。我怎样才能使IReadOnlyCollection<String>可转换为IReadOnlyCollection<Object>?

Make IReadOnlyCollection<T>T 中的协变。Mark itout.


考虑以下代码:

delegate void Action<in T>(T t);
interface IFoo<in X>
{
  void M(Action<X> action);
}

为什么编译器说这是无效的?

因为它是无效的。让我们看看为什么。

class Foo : IFoo<Fruit>
{
  public void M(Action<Fruit> action)
  {
     action(new Apple()); // An apple is a fruit.
  }
}
...
IFoo<Fruit> iff = new Foo();
IFoo<Banana> ifb = iff; // Contravariant!
ifb.M(banana => { banana.Peel(); });

遵循逻辑。该程序将一个苹果作为“this”传递Banana.Peel(),这显然是错误的。

编译器知道这种情况可能会发生,因此首先不允许声明该接口。


如果我对方差还有更多疑问,我该怎么办?

您应该首先阅读我有关该功能的设计和实现的文章。从底层开始;它们按时间倒序排列:

http://blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance/

如果您仍然有问题,那么您应该在此处发布实际包含问题的问题,而不是让人们猜测问题到底是什么。

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

C# 泛型继承和协变第 2 部分 的相关文章

  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • .NET 单点登录

    我一直在尝试使用 C 为 NET Web 应用程序实现 WEB SSO 服务提供程序插件 我将使用 shibboleth 身份提供商 我已经使用 OpenSAML 库为 java 应用程序实现了相同的功能 我想知道在 NET 应用程序中使用
  • Linq - 从表达式 创建表达式

    我有一个谓词Expression
  • 为什么我会收到未找到分析器的警告?

    我创建了一个玩具项目来检查最新的 NET 7 预览版 5 和正则表达式代码生成 它效果很好 所以我对现有项目应用了相同的更改 不是为了生产 而是为了个人生产力 由于某种原因 我收到这些警告 CS8032 An instance of ana
  • STL之类的容器typedef快捷方式?

    STL 容器的常见模式是这样的 map
  • 将公历日期转换为儒略日期,然后再转换回来(随着时间)

    我正在编写一个程序 必须将当前的公历日期和时间转换为儒略日期 然后再转换回公历门 最终我需要添加能够添加年 月 日 小时 分钟和秒的功能 但我需要先解决这部分问题 现在我已经从公历日期转换为儒略日期 所以从逻辑上讲 我觉得我应该能够以某种方
  • 最新 .Net MongoDb.Driver 的连接问题

    我创建了一个 MongoLab 沙箱数据库 我与 MongoChef 连接 效果很好 我通过 Nuget 安装了 MongoDB Driver 2 2 2 我编写了一些简单的 C 演示代码 但就是无法使其工作 连接字符串是直接从 Mongo
  • 警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)

    我的代码中有这个问题 bool CBase isNumber return id MID NUMBER bool CBase isVar return id MID VARIABLE bool CBase isSymbol return i
  • 在没有 epsilon 的情况下可以将浮点数与 0.0 进行比较吗?

    我知道 要比较两个浮点值 需要使用一些 epsilon 精度 因为它们并不精确 但是 我想知道是否存在边缘情况 我不需要那个 epsilon 特别是 我想知道这样做是否总是安全的 double foo double x if x lt 0
  • 嵌入资源文件的路径

    我的资源文件中有一个图标 我想引用它 这是需要图标文件路径的代码 IWshRuntimeLibrary IWshShortcut MyShortcut MyShortcut IWshRuntimeLibrary IWshShortcut W
  • ASP.NET - 在 RenderContent 调用中将事件处理程序添加到 Repeater 内的 LinkBut​​ton

    我有一个加载自定义用户控件的 Sharepoint WebPart 用户控件包含一个 Repeater 而 Repeater 又包含多个 LinkBut ton 在 Web 部件的 RenderContent 调用中 我有一些用于添加事件处
  • 对作为函数参数传递的指针使用删除

    删除作为函数参数传递的指针是否可以 并且合法 如下所示 include
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • 配置:错误:无法运行C编译的程序

    我正在尝试使用 Debian Wheezy 操作系统在我的 Raspberry Pi 上安装不同的软件 当我运行尝试配置软件时 我尝试安装我得到此输出 checking for C compiler default output file
  • 您对“大规模 C++ 软件设计”的看法 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 正在阅读亚马逊评论 https rads stackoverflow com amzn click com 0201633620 and ACC
  • 如何构建一棵与或树?

    我需要一个支持 与 和 或 的树结构 例如 给定一个正则表达式 如ab c d e 我想把它变成一棵树 所以 一开始我们有两个 或 分支 它可以向下ab or c d e 如果你低头ab分支 你得到两个节点 a and b or a其次是b
  • DataGridView 行背景颜色没有改变

    我想根据加载时的特定条件更改 DGV 行的背景颜色 即使在 Windows 窗体中也是如此 但我看不到任何 DGV 行的颜色有任何变化 谁能告诉我如何解决这个问题 private void frmSecondaryPumps Load ob
  • 卸载程序

    我正在尝试使用此代码卸载程序 但它似乎不起作用 我尝试过其他答案 但似乎也不起作用 有人可以帮助我吗 我正在尝试按给定名称 displayName 卸载该程序 例如 我给出 displayName Appname 那么此代码应该从我的计算机
  • 从脚本启用/禁用 GameObject 组件 [Unity3D]

    我需要获取一个脚本中设置的布尔值 放入名为 bouclier 的变量 以启用或禁用游戏对象 该变量位于游戏对象 Player 中 此处右下角 我需要启用或禁用这个游戏对象 Bouclier01 为此 我将脚本附加到游戏对象 Bouclier
  • 实体框架代码首次日期字段创建

    我正在使用实体框架代码优先方法来创建我的数据库表 下面的代码 创建一个DATETIME数据库中的列 但我想创建一个DATE柱子 DataType DataType Date DisplayFormatAttribute ApplyForma

随机推荐

  • ShaderTextureLod参数值?

    LOD参数取什么值纹理洛德 我找到的规范根本没有提到这一点 是百分比还是带百分比的指数值 如果是后者 有没有办法获取纹理的 mipmap 数量 以便我能够使用百分比 LOD参数指定 mipmap 级别 四舍五入到最接近的整数 请记住 Ope
  • Docker 和 XDebug 不读取断点 VSCode

    过去 6 个月 我一直在 MAC 上使用 XDebug 和 PHP 7 0 版本 对 Docker 容器进行远程调试 我正在运行旧版本的 docker 它使用 VirtualBox 来为 docker 建立虚拟机 一切正常 我最近将 doc
  • 无法解决 PyCaret 的导入错误

    我试图通过在 anaconda python 3 8 中创建环境来安装 pycaret 一切都很好 除了当我试图从pycaret classification import 尽管我已经安装了所有依赖项 但我还是显示错误 ImportErro
  • 列出用户定义的变量,python

    我正在尝试迭代 python 脚本中设置的变量 我遇到了以下情况 枚举或列出 此处您最喜欢的语言 程序中的所有变量 在第一个例子中 us bin python foo1 Hello world foo2 bar foo3 1 a 2 b f
  • 使用命令和工厂设计模式来执行排队作业

    我有一个在数据库中排队的作业列表 我需要从数据库中读取这些作业并使用线程并行执行它们 并且我有一个命令类列表来执行每个作业 所有这些作业都实现了通用接口 命令模式 但是当我从数据库检索待处理的作业时 我需要为每个作业实例化正确的命令对象 如
  • 获取具有固定宽度的多行文本的高度以使对话框正确调整大小

    我想创建一个对话框 其中包含某种多行文本元素 JLabel JTextArea 等 并换行 我希望对话框具有固定宽度 但根据文本大小调整高度 我有这个代码 import static javax swing GroupLayout DEFA
  • LINQ 中的动态 where 条件

    我有一个场景 我必须在 LINQ 中使用动态 where 条件 我想要这样的东西 public void test bool flag from e in employee where e Field
  • 在 Objective-C 中创建整数属性数组

    我在 Objective C 中创建整数数组的属性时遇到问题 我不确定这是否可以在 Obj C 中做到 所以我希望有人可以帮助我找出如何正确地做到这一点或提供替代解决方案 myclass h interface myClass NSObje
  • 如何分析在生产服务器上运行的 ASP.NET 应用程序?

    我有一个 ASP NET 应用程序 在生产服务器上始终使用 75 100 的 CPU 如何分析应用程序以找出代码的哪一部分占用了最多的 CPU 我研究了几种不同的工具 Xte Profiler EQATEC dotTrace 但它们似乎都希
  • `filter(func)` 和 `filter(|x| func(x))` 有什么区别?

    有什么区别filter x func x and filter func 也许一个好的起点是了解如何filter func 可以使用类似于以下的语法来编写filter x func x 我的代码如下所示 fn filter out dupl
  • Application.Current.MainWindow.Close 与 Application.Current.Shutdown

    Should Application Current Shutdown 不作为关闭 WPF 应用程序的最佳实践吗 我有一个小型的多窗口应用程序 关闭 似乎对我的所有退出命令都很有效 但是 我被告知要始终使用Application Curre
  • 使用 Nodejs 的 Firebase 电话身份验证

    我查看了 firebase 的文档 但没有得到任何在服务器端通过电话验证用户身份的答案 我发现的只是 FIREBASEUI 或客户端身份验证 那么 我如何通过服务器端对用户进行身份验证 例如以表单形式向他们提供电话号码的输入 并在该表单上向
  • datetime_select 的值为零?

    当使用 作为 新 对象表单时 如何将选项设置为默认不选择日期而是选择 nil null 值 相关模型中的字段可以选择为空 但默认情况下 datetime select 控件没有空选项 我想你想要 f datetime select star
  • 简单的去抖动例程

    您是否有一个简单的去抖例程可以方便地处理单个开关输入 这是一个简单的裸机系统 没有任何操作系统 我想避免具有特定计数的循环构造 因为处理器速度可能会波动 我想你可以在这里学到很多东西 http www ganssle com debounc
  • 如何忽略数组解构中的某些返回值?

    当我只对索引 0 之外的数组值感兴趣时 在数组解构时是否可以避免声明无用的变量 在下文中 我想避免声明a 我只对索引 1 及以后感兴趣 How can I avoid declaring a const a b rest 1 2 3 4 5
  • 如何使用 Node.js 抓取包含动态内容的页面?

    我正在尝试刮一个website但我没有得到一些元素 因为这些元素是动态创建的 我在node js中使用cheerio 我的代码如下 var request require request var cheerio require cheeri
  • 如何在coldfusion中使用CFQuery执行2个或多个插入语句?

    是否可以使用执行 2 个插入或更新语句cfquery 如果是的话怎么办 如果不是 在 Coldfusion 中执行多个查询的最佳方法是什么 即仅打开一个到数据库的连接 我想每次我们打电话cfquery我们正在打开新的连接数据库 是否可以执行
  • Ember、Ember 数据和 MongoDB 的 _id

    我已经看到有人讨论过这个问题 但我仍然对处理 Mongo 的问题有疑问 id into id 我使用 mongoose 作为我的 ORM 虽然它有虚拟 但我似乎无法让它正常工作 以下是我的猫鼬模型中的内容 尝试从后端修复 mongoose
  • 如何在列表视图中实现OnScrollListener?

    我从服务器获取 500 条记录 我想在列表视图中显示 10 个项目 当列表视图到达末尾时我需要加载另外 10 个项目 依此类推 我在网上看到了很多例子 但我无法解决它 请帮助我 这是我的代码 public void onCreate Bun
  • C# 泛型继承和协变第 2 部分

    这是我的原始线程 C 泛型继承和协变 仅在我的只读界面上 我希望继承起作用 public delegate Boolean EnumerateItemsDelegate