这是 C# 4 中的协方差错误吗?

2024-02-09

在下面的代码中,我希望能够隐式转换elements to baseElements因为TBase可以隐式转换为IBase.

public interface IBase { }
public interface IDerived : IBase { }
public class VarianceBug
{
    public void Foo<TBase>() where TBase : IBase
    {
        IEnumerable<TBase> elements = null;
        IEnumerable<IDerived> derivedElements = null;
        IEnumerable<IBase> baseElements;

        // works fine
        baseElements = derivedElements;

        // error CS0266: Cannot implicitly convert type 
        //   'System.Collections.Generic.IEnumerable<TBase>' to 
        //   'System.Collections.Generic.IEnumerable<IBase>'. 
        //   An explicit conversion exists (are you missing a cast?)
        baseElements = elements;
    }
}

但是,我收到评论中提到的错误。

引用规范:

A type T<A1, …, An>可方差转换为类型T<B1, …, Bn> if T是使用变体类型参数声明的接口或委托类型T<X1, …, Xn>,并且对于每个变体类型参数Xi以下其中一项成立:

  • Xi是协变的,并且存在隐式引用或身份转换Ai to Bi

  • Xi是逆变的,并且存在隐式引用或身份转换Bi to Ai

  • Xi是不变的,并且存在身份转换Ai to Bi

检查我的代码,它似乎与规范一致:

  • IEnumerable<out T>是一个接口类型

  • IEnumerable<out T>使用变体类型参数声明

  • T是协变的

  • 存在隐式引用转换TBase to IBase

那么,这是 C# 4 编译器中的错误吗?


方差仅适用于引用类型(或者有一个identity转换)。不知道的是TBase是引用类型,除非你添加: class:

 public void Foo<TBase>() where TBase : class, IBase

因为我可以写一个:

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

这是 C# 4 中的协方差错误吗? 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj

随机推荐

  • LinkedIn 帖子检查员在 https URL 上遇到服务器错误

    在 LinkedIn 帖子检查器中检查给定 URL 会返回以下摄取反馈 Error We encountered a server error while trying to inspect the URL URL 重定向轨迹显示 1 0
  • 将网格 3D 数据插值到更精细的比例

    我有一个概率曲面的 NetCDF 文件 它是一个 30x30 的网格 纬度 经度间隔为 0 25 度 并在 z 维度中描述概率表面 我可以轻松地将其导入 NetCDF 查看器 Panoply 然后轻而易举地 选中一个框 将原始数据插值 平滑
  • 在同一环境中使用同一编译器编译同一程序时,未指定和未定义的行为是否需要保持一致?

    让我们假设我的程序包含 C 标准规定为未指定行为的特定构造 这基本上意味着实现必须做一些合理的事情 但允许不记录它 但是 每次编译具有未指定行为的特定构造时 是否需要实现产生相同的行为 或者是否允许在不同的编译中产生不同的行为 未定义的行为
  • 如何显示多个权限请求的权限理由?

    我正在使用 Android API 25 需要在应用程序中发出权限请求 有大量关于如何发出请求以及如何显示基本原理的代码示例 这个链接在这里 https github com googlesamples android RuntimePer
  • 项目是否必须创建为精灵套件,还是可以简单地添加框架?

    我正在退一步学习我正在制作的 2D 游戏的精灵套件 而不是使用 UIKit 在我读过的所有教程中 他们将新项目创建为 Sprite Kit 而不是单一视图 只是想知道我是否需要重新创建我的游戏 或者我是否可以简单地将精灵套件框架添加到我现有
  • 根据条件在多对多表中执行左连接

    一般案例 当您想要向关系的外部添加条件时 如何在多对多关系中执行左连接 具体案例 我们正在处理两个表 team and pool 还有一个team pool表充当它们之间的多对多联结表 另外 一个pool has a stage id co
  • 错误:函数返回局部变量的地址

    我是 C 初学者 正在自学 我正在创建以下函数 char foo int x if x lt 0 char a 1000 char b blah x x 1 char c foo x strcpy a b strcat a c return
  • 如何用docker文件覆盖nginx默认配置?

    我有一个使用 React router 的应用程序 我为它创建了一个 docker 镜像 我正在使用 nginx 服务器并且它可以工作 但是 刷新页面会出现 nginx 404 错误 我知道我需要覆盖 nginx 配置文件才能使其工作 但不
  • 如何在 C++ 正则表达式中使用 Unicode 范围

    我必须在 C 的正则表达式中使用 unicode 范围 基本上我需要的是有一个正则表达式来接受所有有效的 unicode 字符 我只是尝试使用测试表达式并面临一些问题 std regex reg u0080 uDB7Fa z0 9 问题是与
  • Django DDP 帮助

    对于这个问题我很抱歉我还不是 django 和meteorjs 的专家 我正在尝试使用此 django ddp 技术 但我有点陷入示例使用说明中的 启动 Django DDP 服务 https github com commoncode d
  • 未加权图的最短节点序列

    我想知道是否有一种算法可以通过从头节点到尾节点的图找到最短的节点序列 该图从头节点分支出来 并且是任意复杂的 并在尾节点处收敛 节点之间的所有连接都是未加权的 我正在考虑解决这个问题 从头节点和尾节点采取探索性步骤 直到图形两端的节点接触等
  • 使用 LESS mixin 多次设置变量但得到错误的结果

    在前面 我今天开始少了 因此 欢迎提出如何做得更好的建议 我有以下 less 文件 test target context em target context 1em custom field position relative test
  • Java 将文本字符串添加到 Rectangle2D

    我有一些矩形 给定一个声明并定义为的矩形 Rectangle2D rec new Rectangle2D Double 50 50 50 50 是否可以在该矩形内添加一串文本 谢谢 不要尝试将字符串放入预定义的矩形中 而是考虑使用FontM
  • 如何在同一部分文本上的 TextView 文本上设置多个跨度?

    假设我有下一个文本 你好堆栈溢出 我希望将第二个词设置为两者相对尺寸跨度 http developer android com reference android text style RelativeSizeSpan html 设置相对字
  • 在Android中如何实现这样的UI呢?

    在我的一个应用程序中 我需要为线性布局创建一个边框 如下所示 我不想有图像并将其设置为背景 因为那时我需要为不同的设备创建各种尺寸的图像 如果我使用线性布局创建布局并使用绝对定位放置文本视图 则它在不同设备中可能看起来不符合预期 那么实现这
  • Django复杂查询从groupby和having子句中获取数据

    我想在具有 CNT Status 的 MyUser 表上执行 group by 子句 原始查询如下所示 SELECT user id from user table GROUP BY user id HAVING COUNT status
  • 尝试运行 Docker 导致退出代码 127

    我正在尝试在使用 docker 的 Windows 中运行某个应用程序 由于该应用程序是 shell 脚本 因此我使用 cygwin 终端 作为 docker 的新手 我对其工作原理没有明确的想法 使用 boot2docker 我在 Win
  • C++ 中的“auto 运算符”是什么?

    Clang https en wikipedia org wiki Clang和 Visual Studio 编译器 但不是GCC https en wikipedia org wiki GNU Compiler Collection 允许
  • 应用模板上选择属性的 xslt 处理

    我有一个如下所示的 XSLT 并将该 xslt 应用于输入 xml 粘贴在下面 它工作正常 除了需要澄清的一件事 这是输入 xml
  • 这是 C# 4 中的协方差错误吗?

    在下面的代码中 我希望能够隐式转换elements to baseElements因为TBase可以隐式转换为IBase public interface IBase public interface IDerived IBase publ