铸造泛型和泛型类型

2024-06-30

考虑一下,我有以下 3 个类/接口:

class MyClass<T> { }

interface IMyInterface { }

class Derived : IMyInterface { }

我希望能够投射MyClass<Derived> into a MyClass<IMyInterface>或反之亦然:

MyClass<Derived> a = new MyClass<Derived>();
MyClass<IMyInterface> b = (MyClass<IMyInterface>)a;

但如果我尝试,我会收到编译器错误:

Cannot convert type 'MyClass<Derived>' to 'MyClass<IMyInterface>'   

我确信我不能这样做有一个很好的理由,但我想不出一个。

至于我为什么要这样做 - 我想象的场景是您理想地希望使用一个实例MyClass<Derived>为了避免大量令人讨厌的强制转换,但是您需要将实例传递给接受的接口MyClass<IMyInterface>.

所以我的问题是双重的:

  • 为什么我不能在这两种类型之间进行转换?
  • 有没有什么方法可以保持使用实例的愉快感MyClass<Derived>同时仍然能够将其转换为MyClass<IMyInterface>?

这不起作用,因为 C# 仅支持接口和委托的类型参数的协变。如果您的类型参数仅存在于输出位置(即您只从类中返回它的实例并且不接受它作为参数),您可以创建一个如下接口:

interface IClass<out T> { }
class MyClass<T> : IClass<T> { }

这将允许你这样做:

IClass<Derived> a = new MyClass<Derived>();
IClass<IMyInterface> b = a;

老实说,这已经是您所能达到的最接近的结果,并且需要 C# 4 编译器才能工作。

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

铸造泛型和泛型类型 的相关文章

  • 使用 解释 gprof 输出

    我试图在我的程序中找到性能问题 从而通过分析来检测代码 gprof 创建一个如下所示的平面配置文件 Flat profile Each sample counts as 0 01 seconds cumulative self self t
  • C++/OpenCV 将相机视频/图像 (MJPEG) 从套接字流式传输到浏览器 (Windows 8.1)

    对于 openCV C 来说还是很陌生 所以请耐心等待 我目前正在尝试找到一种好的 也可能是简单的 方法来从我的 OpenCV 应用程序实时 或几乎实时 流式传输我的相机帧 以便我可以打开浏览器 输入 IP 并查看图像 到目前为止 我使用w
  • ASP.NET Core处理JSON反序列化问题

    我想更改 ASP NET Core 中无效 JSON 请求处理的默认行为 我有这个模型 public class Model public Guid Id get set 当我用这个 body 发送这个请求时 Id null 它返回此错误消
  • C++ 相当于 fscanf()?

    请不要说它是 fscanf P 我正在尝试替换这一行 if fscanf fp P c n ch 1 如果我理解正确的话 它会尝试读取 char 并将其存储到 ch 前提是它位于 P 和 n 之间 是对的吗 如果成功 它会返回1 它读取的字
  • 如何使用OpenCV的归一化相关性?

    如何使用 OpenCV 的归一化相关性 有人可以提供代码示例吗 我的问题 我有一个螺丝头图像 需要找到螺丝的中心 所以我正在考虑使用 OpenCV 相关性 这是一个好主意吗 您可以在下面的链接下找到示例图像 http imageshack
  • 如何从 appsettings.json 获取日期时间?

    我有 net core 5 0 应用程序并尝试从 appsettings json 获取 DateTime 应用程序设置 json TimeModel RestartDuration 27 10 2021 12 30 00 Code ser
  • 在 C# 中创建新 List 的这三种方式有什么区别?

    这三种创建新的方式有什么区别List
  • 从函数和方法返回受约束的泛型

    我想创建一个返回符合协议的对象的函数 但该协议使用typealias 给出以下玩具示例 protocol HasAwesomeness typealias ReturnType func hasAwesomeness gt ReturnTy
  • 将数据路径数据到树状数据结构

    我有以下数据 root root blue root blue temp root main root main dev root main back root etc init root etc init dev root etc ini
  • 为什么 C# 三元运算符不能与委托一起使用?

    当分支选择函数时 使用三元运算符来选择函数可能是有意义的 但这是不可能的 为什么 public class Demo protected bool branch protected void demo1 protected void dem
  • 我应该如何继承IDisposable?

    为了保护无辜者 班级名称已更改 如果我有一个名为 ISomeInterface 的接口 我还有继承该接口的类 FirstClass 和 SecondClass FirstClass 使用必须处置的资源 二等舱没有 那么问题来了 我应该从哪里
  • 使用 X509 证书对多个收件人进行 XML 加密和解密

    我已经成功地使用 MSDN 上的示例来加密和解密 xml 文档 http msdn microsoft com en us library ms229744 aspx http msdn microsoft com en us librar
  • 单元测试依赖注入

    我在用Autofac for IoC 这是我的容器启动器类 其职责是注册依赖项 public class ContainerInit public static IContainer BuildContainer var conFac ne
  • 在文本文件中搜索字符串的更快方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要使用 C 在一组文本文件中搜索一个大约 13 个字符的字符串 文本文件的数量正在变化 范围在 100 1000 之间 文件大小范
  • C# 我可以访问没有完整限定名称的枚举吗

    我有一个 C 枚举类型 它以非常长的限定名称结尾 例如 DataSet1 ContactLogTypeValues ReminderToFollowupOverdueInvoice 为了便于阅读 如果我可以告诉一个特定的函数只使用名称的最后
  • 如何从库调用方法到 C# 控制台

    我在新库中创建了一个方法 这是我的代码 namespace ClassLibrary1 public class Class1 public static bool ISprime int prime if prime lt 2 retur
  • 如何在预处理器中检测X32 ABI或环境?

    X32是一个 ABIamd64 x86 64使用 32 位指针的 CPU 这个想法是将 x86 64 的较大寄存器集与 32 位指针产生的较小内存和缓存占用空间结合起来 它可提供高达约 40 的加速 看x86 x32 和 x64 架构之间的
  • Dapper 中的自定义映射

    我正在尝试使用带有 Dapper 和多重映射的 CTE 来获取分页结果 我遇到了重复列的不便 例如 CTE 阻止我命名列 我想将以下查询映射到以下对象 而不是列名和属性之间的不匹配 Query WITH TempSites AS SELEC
  • Sharepoint 客户端 GetFolderByServerRelativeUrl 文件夹修改日期

    我试图在使用 GetFolderByServerRelativeUrl 函数时检索文件夹的 修改日期 和 创建日期 我该怎么做 我只能从中获取relativeUrl 和文件夹名称 下面是我为检索文件夹所做的操作 请帮忙 FolderColl
  • “auto_ptr”和 STL 容器:编写错误用法的示例

    读完本教程后提出这个问题 http www cprogramming com tutorial auto ptr html http www cprogramming com tutorial auto ptr html 在那里你可以找到以

随机推荐