C# 中委托的协变/不变/逆变

2023-12-10

我有以下代码。我没有为此委托指定任何通用参数和 IN/OUT(方差)。如果我正确理解不变性的含义,我应该无法返回基本类型的对象,因为我的委托提到了对象的返回类型。

我对不变性的理解是错误的吗?

class Program
{
    public delegate object SampleDelegate(Base b);

    static void Main(string[] args)
    {
        List<Base> listBases = new List<Base>(){new Base{}, new Base{}};
        SampleDelegate newDel = new SampleDelegate(ProcessBase);
        newDel(new Base() { });
        Console.ReadLine();
    }

    public static Base ProcessBase(Base b)
    {
        return b;
    }

    public class Base
    {

    }

    public class Derived : Base
    {
    }   
}

如果我正确理解不变性的含义,我应该无法返回基本类型的对象,因为我的委托提到了对象的返回类型。我对不变性的理解是错误的吗?

由于您可以编译并运行该程序,因此您已经知道该问题的答案。是的。

让我们问你想问的问题:

由于委托甚至不是通用的,因此显然对委托的通用差异不适用。那么为什么我可以从返回的方法进行协变转换Base到要求方法返回的委托类型object?

显然,通用协方差不是相关的协方差。这里有一个完全不同的规则。这种转换首先在 C# 2.0 中被允许。当从方法组 to a delegate,从方法组中选择的方法可能具有比委托的返回类型更通用的返回类型,前提是这两种类型都是引用类型。对于参数类型也是如此,它们是逆变的。

允许使用引用类型构造的泛型委托类型之间进行转换的功能同样是协变和逆变的,这一功能是由我顺便添加到 C# 4.0 中的。

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

C# 中委托的协变/不变/逆变 的相关文章

  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • 任何人都可以清楚地告诉如何在不使用像 这样的预定义函数的情况下找到带有小数值或小数值的指数吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 例如 2 0 5 1 414 所以想要 我是 c 的新手 所以请解释简单的逻辑 如果不是复杂的逻辑也足够了 在数学中 从整数取幂到实数
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • UTF-8 字符串分隔符

    我正在解析一个二进制协议 其中 UTF 8 字符串散布在原始字节中 此特定协议在每个 UTF 8 字符串前面添加一个短字符 两个字节 指示后续 UTF 8 字符串的长度 这给出了最大字符串长度 2 16 gt 65 000 这对于特定应用来
  • 如何触发特定的Google自定义搜索引擎细化标签?

    目前 我们的组织正在使用 Google 自定义搜索引擎来提供自动建议 并且我们在 CSE 中配置了大约 3 个优化标签 之前 我们使用 WebSearch 和 SearchControl WebSearch 有一个 setSiteRestr
  • QWizard:更改标题字段的高度/尺寸

    我目前正在尝试为我正在开发的 Python Qt 应用程序实现一个简单的 第一步 向导 使用 Designer 确实很容易做到这一点 但与往常一样 问题在于细节 我的问题是 标题 字段对我来说太大了 约占可用屏幕空间的 50 这里有一个截屏
  • 给定表数据的期望输出

    您好 我有一个表测试其结构如下 Testing PK C1 c2 1 v11 v12 2 v21 v23 3 v31 v32 现在我需要查询该表 测试 以便获得以下输出 Pk Key value 1 c1 v11 1 c1 v12 2 c2
  • 泛型类型约束与继承

    这两个函数声明有区别吗 func doSomething
  • 在 C# 中将很长的日期格式解析为 DateTime

    如何将以下字符串日期解析为 C 中的 DateTime 对象 1970 年 1 月 1 日 星期四 这是来自 XML 提要 而 DateTime Parse 似乎不喜欢 en GB 语言环境中的它 该提要仅来自英国服务器 因此我不必担心全球
  • YUV NV21 转换为 RGB 的困惑

    根据http developer android com reference android graphics ImageFormat html NV21 NV21 是默认使用的格式 网上有很多关于 YUV NV21 到 RGB 转换的代码
  • OpenGL 中纹理像素和屏幕像素之间的一对一映射

    我正在使用 OpenGL 执行以下操作 我的屏幕尺寸是512 512 我有一个与屏幕大小相同的纹理 我想绘制一个覆盖整个屏幕的四边形 并在像素和纹素之间建立一对一的映射 这样我就可以做到texelFetch与着色器中的屏幕坐标 首先 如果我
  • 何时在新类名后添加括号? [复制]

    这个问题在这里已经有答案了 可能的重复 PHP 类实例化 使用或不使用括号 省略括号和无参数对象构造函数 不管有没有括号 新的Class似乎都不麻烦 所以我怀疑括号有什么用 我查了php手册 没有明白 有人能解释一下吗 括号的目的是让您输入
  • 在哪些情况下会跳过 DAG 的阶段?

    我正在尝试查找在我使用 RDD 的情况下 Spark 会跳过阶段的情况 我知道如果发生洗牌操作 它会跳过阶段 于是 我写了下面的代码来看看是否正确 def main args Array String Unit val conf new S
  • 如何阻止代码/程序访问Web应用程序?

    我想阻止任何人尝试通过代码访问我的网站 从代码的意义上来说 任何一个类似于bot的程序 都会造成流量激增 例如 URL url new URL http www example com URLConnection yc url openCo
  • 使用 jquery 调用 ajax 后如何等待图像加载?

    我有一个 Python 脚本 它对 JPEG 图像进行一些操作 我将一些参数传递给此脚本并从 HTML 页面调用它 该脚本返回一个 img src newimage jpg 标签 我知道如何等待脚本的回复 但我不知道如何判断图像何时完全加载
  • 由于 RAM 故障,是否会发生 System.AccessViolationException?

    我有一个网站 我已经工作了大约一年了 最近 它开始时不时地在我的开发机器中抛出 System AccessViolationException 大多数情况下 当我离开机器时 几周以来我没有对服务器代码进行任何更改 因为我一直在 100 地处
  • cmake 错误:QGLWidget:没有这样的文件或目录

    我正在尝试将 cmake 与 Qt 一起使用 但是在构建时出现以下错误 QGLWidget No such file or directory 在我的 CMakeLists txt 文件中 我有 set CMAKE INCLUDE CURR
  • 使用 C# 在另一个应用程序上执行鼠标单击事件

    我需要做的是 我需要使用我的自定义应用程序来控制安装在同一台计算机上的另一个应用程序 例如 如果我需要使用标准 Windows 计算器 我只需将输入事件发送到计算器 我使用了一些代码片段来实现这一点 现在我已经触发了鼠标和键盘事件 但问题是
  • Python 列表的幂集[重复]

    这个问题在这里已经有答案了 我正在尝试实现一个函数来生成列表的幂集xs 总体思路是我们遍历以下元素xs并选择是否包含x或不 我面临的问题是withX最终等于 None 一个单例列表None 因为 我认为 s add x 回报None 这不是
  • 使用 /= 规范化变量会引发 ufunc 错误

    我正在慢慢地进入一些机器学习领域 但在一项使用计算机视觉处理 Kaggle 猫和狗数据集的练习中 发生了一些我不太明白的事情 当我尝试标准化pickle中的图像值时 它在写入时起作用 X X 255 0 但当我写入时抛出错误 X 255 0
  • C select() 超时 STDIN 单字符(无 ENTER)

    我希望能够使用select 从 STDIN 输入单个字符 无 ENTER 因此 当用户按下一个键时 select 应立即返回 而不是等待用户按 ENTER 键 int main void fd set rfds struct timeval
  • 将字符串电话号码转换为整数[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我对 Java 和 Android 都缺乏经验 我正在尝试检索存储在 Android 手机模拟器的联系人之一中的电话号码 虽然我成功获取了它 但该号码已以 987 654 3210
  • C# 中委托的协变/不变/逆变

    我有以下代码 我没有为此委托指定任何通用参数和 IN OUT 方差 如果我正确理解不变性的含义 我应该无法返回基本类型的对象 因为我的委托提到了对象的返回类型 我对不变性的理解是错误的吗 class Program public deleg