将类型参数约束为基类型

2023-12-27

我知道如何强制类型参数成为subtype另一种类型:

public interface IMapping<T2> 
{
    public void Serialize<T3>(T3 obj) 
        where T3 : T2;
}
...

var mapping = MapManager.Find<Truck>();
mapping.Serialize(new TonkaTruck());

有没有办法强制类型参数成为超类型另一种类型的?

public interface IMapping<T2>
{
    public void IncludeMappingOf<T1>() 
        where T2 : T1;   // <== doesn't work
}
...

var mapping = MapManager.Find<Truck>();

// Truck inherits Vehicle    
// Would like compiler safety here:
mapping.IncludeMappingOf<Vehicle>(); 

mapping.Serialize(new TonkaTruck());

目前,我必须在运行时使用 T1 和 T2 进行比较IsSubclassOf inside IncludeMappingOf。编译安全的解决方案会更好。有任何想法吗?

EDIT:更改了示例以减少设计臭味。

NOTE:链接的问题非常相似,但没有给出合适的答案。希望这个问题也能对这个问题有所启发。

EDIT #2:

更简单的例子:

public class Holder<T2>
{
    public T2 Data { get; set; }

    public void AddDataTo<T1>(ICollection<T1> coll)
        //where T2 : T1    // <== doesn't work
    {
        coll.Add(Data);   // error
    }
}

...
var holder = new Holder<Truck> { Data = new TonkaTruck() };
var list = new List<Vehicle>();
holder.AddDataTo(list);

编译器:参数类型“T2”不可分配给参数类型“T1”。是的,我知道,我试图让编译器只允许 T2 可分配给参数类型 T1 的情况!


虽然 w0lf 的答案给出了直接的解决方案,但我想给出一些背景解释。

当你写类似的东西时

class C<A> where A : B

or

void F<A>() where A : B

形式的约束A : B一定有A作为所声明的类、接口、方法等的泛型类型参数之一。

您面临的错误是not因为您已将当前声明的泛型类型参数放置在冒号的右侧(这是合法的) - 这是因为您已将外部声明(不是当前声明)的泛型类型参数放置在左侧结肠的。

如果你想形成一个约束A : B在某些声明中,A必须在该声明和范围中引入A必须小于或等于范围B。这是一个实用的语言限制的原因是,对于任何泛型类型参数T,它隔离了有关类型约束的任何推理T到单个声明,其中T正在介绍中。

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

将类型参数约束为基类型 的相关文章

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags

随机推荐

  • 两个“np.longdouble”的总和会产生很大的数值误差

    早上好 我正在从 FITS 文件中读取两个数字 表示单个数字的整数和浮点部分 将它们转换为长双精度数 在我的机器中为 128 位 然后将它们相加 使用 128 位浮点数得到的结果并不像我预期的那么精确 这是代码 a int np longd
  • 错误:redirect_uri_mismatch 在 MVC 应用程序的 Google 登录中

    我正在尝试通过 MVC C 应用程序将视频上 传到 YouTube 我正在关注这个link https github com youtube api samples tree master dotnet 每当我尝试运行该应用程序时 我都会收
  • Android MediaCodec:多个 SurfaceView 支持多少个同步(视频)解码线程?

    From Grafika https github com google grafika项目 文件 DoubleDecodeActivity java 我在 3 个 SurfaceView 上使用 MediaCodec API 尝试了 3
  • 带有 poco 生成的实体框架 IQueryable

    我创建了一个 T4 模板 它生成标准实体类及其每个属性的接口 以便我可以制作仅包含我想要的数据的自定义 poco 对象 我还创建了一个复制函数 它可以在实现所述实体接口的任何对象之间进行转换 生成的代码如下所示
  • 如何在 Apple 的 TestFlight 服务上重新发送外部测试人员邀请 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • macOS + Qt + Intellisense 上的 Visual Studio Code

    Visual Studio Code 出现以下错误 cannot open source file QtWidgets qtwidgetsglobal h dependency of QApplication C C 1696 我有一个 C
  • CALayer 的动画结束回调?

    我想知道 CALayer 中动画的回调在哪里 或者是否有任何东西 具体来说 对于隐式动画 例如更改框架 位置等 在 UIView 中 您可以执行以下操作 UIView beginAnimations SlideOut context nil
  • ng-bootstrap 模式不显示

    我在我的应用程序中使用 ng bootstrap 模式来显示对话框 但是当单击按钮时 什么也没有发生 模式没有显示 在调试时 它可能会发现该操作被调用 但模式未显示 这是我的 app module ts import NgModule fr
  • Vaadin Binder 中的上传组件,例如粗略编辑器

    我有一个 Crud 来自 Vaadin Pro 并且想使用 BinderCrudEditor 中的上传组件 Upload 组件不存储值 或者更确切地说 缺少 HasValue 接口 因此我无法使用 Binder 有没有什么方法可以以某种方式
  • persp() 轴标签中的下标

    我正在尝试使用以下函数绘制两个变量的函数persp R 中的函数 这是我到目前为止所拥有的 C unab lt function u1 u2 return u1 u2 x lt seq 0 1 by 0 1 y lt seq 0 1 by
  • 同时绘制 3D 平面和点

    我正在尝试使用 Matplotlib 同时绘制一个平面和 3D 中的一些点 我没有错误 只是点不会出现 我可以在不同时间绘制一些点和平面 但不能同时绘制 代码部分如下所示 import numpy as np import matplotl
  • 尝试在 Android Studio 上运行增强

    我正在尝试在 Android Studio 中设置 jdo jpa 并遵循上一个问题的答案here https stackoverflow com questions 23303893 google apps engine backend
  • 接口实现(接口隔离原则)

    我遇到一种情况 我需要调用第三方服务来获取一些信息 这些服务对于不同的客户可能会有所不同 我的界面中有一个身份验证功能 如下所示 interface IServiceProvider bool Authenticate string use
  • LinqPad 不使用 C# 语句返回结果

    已经很晚了 所以这一定是愚蠢的事情 我已将 LinqPad 连接到我的数据库 但似乎无法获得最简单查询的结果 var q from app in AppInstances select new AppId app AppId 当我运行它时
  • 在视图中获取 Laravel 5 控制器名称

    我们旧网站 CSS 的设置是为了body标签有一个控制器名称的 id 和一个动作名称的类 使用 Zend Framework 1 现在我们切换到 Laravel 5 我找到了一种通过Route类 但找不到控制器名称的方法 我在 Larave
  • 通过字符串在对象图中查找属性

    我正在尝试使用访问嵌套类结构的各个部分随意的细绳 给定以下 人为的 类 public class Person public Address PersonsAddress get set public class Adddress publ
  • SQL Server 查询超时

    访问 SQL Server 2012 数据库的第 3 方应用程序正在获取 Microsoft ODBC SQL Server Driver Query timeout expired执行大约20分钟后出现错误 这是应用程序开始接收错误后我在
  • Php 标头位置重定向不起作用

    不知道为什么这不起作用 这是代码 if isset POST cancel POST cancel cancel header Location page1 php echo POST cancel 此输出不是重定向页面 而是cancel到
  • java.lang.RuntimeException: CronExpression '4 27 11 ? 8? 2014' 无效,

    将此作为无效的 CronExpression 无法弄清楚为什么 转介http www quartz scheduler org documentation quartz 1 x tutorials crontrigger http www
  • 将类型参数约束为基类型

    我知道如何强制类型参数成为subtype另一种类型 public interface IMapping