为什么继承的接口无法在通用上下文中转换为其基接口?

2024-01-17

我正在尝试在我的 C# 项目中实现接口继承系统,但无法让它工作。

这是一个简化版本:

public interface BaseInterface {}

public abstract class AbstractClass<T> where T : BaseInterface {}

public interface ChildInterface : BaseInterface {}

public class ConcreteClass : AbstractClass<ChildInterface> {}

我想按如下方式使用它:

AbstractClass<BaseInterface> c = new ConcreteClass();

最后一行代码给我以下错误:

无法将类型“ConcreteClass”隐式转换为“AbstractClass

为什么转换不可能?


让我们尝试一下您的类型并给它们起不同的名字。

public interface IFruit { }

public abstract class BowlOf<Fruit> where Fruit : IFruit
{
    public void Add(Fruit fruit) { }
}

public class Apple : IFruit { }

public class BowlOfApples : BowlOf<Apple> { }

现在,这样 - 这几乎只是类型的重命名(但是改变public interface ChildInterface : BaseInterface {} to public class Apple : IFruit { })然后我们创建以下问题。

假设我有public class Banana : IFruit { }另外,我们假设以下内容是合法的:

BowlOf<IFruit> c = new BowlOfApples();

那我就可以打电话了c.Add(new Banana())。什么!?!你不能在一碗苹果中添加一根香蕉。

这就是为什么当你尝试这样做时编译器会抱怨AbstractClass<BaseInterface> c = new ConcreteClass();.

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

为什么继承的接口无法在通用上下文中转换为其基接口? 的相关文章

  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • fill_ Between() 不起作用

    I have this tiny problem with a chart I am working on I d like to fill the area between 2 semi vertical lines as shown b
  • 从 OpenCV + Python 获取 HOG 图像特征?

    我读过这篇关于如何使用 OpenCV 基于 HOG 的行人检测器的文章 如何使用 OpenCV 检测和跟踪人员 https stackoverflow com questions 2188646 how can i detect and t
  • 如何删除前导“0”。在数值 R 变量中

    如何简洁地更改数字 R 变量 保持其数字 以便例如 0 34 变成简单的 34 仅当输出数值时 才必须选择具体的表示形式 即数字的格式 您不能将数值变量从 0 34 更改为 34 两者都是同一数字的表示 但是 当您输出表达式时e 您可以选择
  • 'git reset --soft' 是一个无操作命令吗?

    The 文档 http linux die net man 1 git reset指出利用 soft option 根本不触及索引文件或工作树 但要求它们处于良好的顺序 这使得所有更改的文件 要提交的更改 正如 git status 所说的
  • NoSuchFieldError 实例位于 org.apache.http.impl.io.DefaultHttpRequestWriterFactory

    java version 1 7 0 71 Gradle 2 1 Hello UPDATE 依赖关系 gradle dependencies grep httpcore org apache httpcomponents httpcore
  • 如果应用程序未至少启动一次,广播接收器将无法在 ICS 中工作

    这个问题在堆栈溢出中被问过几次 但还没有解决方案 我有一个广播接收器 用于接收 USB 连接操作 广播接收器的责任是 如果我得到意图启动我的应用程序 在清单文件中 我添加了接收器 我在 GingerBread 中也有同样的逻辑 但 ICS
  • 暂停 UIImageview 动画

    我想暂停UIImageView animation根据我的研究发现 您可以停止图像的动画 但无法暂停序列 通过调用语句stop animating on the UIImageView然后它停止动画并清空图像视图 要暂停 UIImages
  • 片段实例化崩溃

    我的一些用户遇到了崩溃 这是 Google Play 开发者控制台上的崩溃报告中显示的错误 Unable to start activity ComponentInfo com havens1515 autorespond com have
  • 表面网格到体积网格

    我有一个使用 Meshlab 从点云生成的封闭表面网格 我需要为此获得一个体积网格 这样它就不是一个空心物体 我想不通 我需要获取 stl 文件进行打印 谁能帮我获得体积网格 我更喜欢简单的解决方案而不是复杂的算法 给定一个定向的水密表面网
  • GKE Ingress-GCE 是否支持压缩?

    我的后端在 Rocket Rust 中没有内置压缩功能 因此 它依赖于代理来压缩它 虽然 nginx 入口控制器支持它 但我想默认的入口控制器是否也有它 因为它具有高可用性 如果没有的话应该如何设置呢 更新 2018 01 31 它看起来像
  • 如何从 R 中拟合线性 b 样条回归中提取基础系数?

    以下面的一结 一级样条为例 library splines library ISLR age grid seq range Wage age 1 range Wage age 2 fit spline lm wage bs age knot
  • Youtube API v3,topicId 恢复

    Youtube API v3 使开发人员能够检索有关特定视频的特定信息 在返回的数据中 有一个称为topicDetails可以按照以下示例请求 Request https www googleapis com youtube v3 vide
  • Angular 无法使用不同数量的子级重新附加 ActivatedRouteSnapshot

    这是我在 NativeScript Angular 项目中的路由 const routes Routes path redirectTo tabs default pathMatch full path tabs loadChildren
  • 如何获取 AJAX 发送的 JSON 以与 PHP 配合使用

    在我寻求让 PHP 可以使用这个 JSON 的过程中 我遇到了一个又一个的障碍 所以我想知道是否有人可以帮助我 我将 JSON 存储在变量 DivisionsJSON 中 var divisionsJSON JSON stringify d
  • 尝试创建一个删除按钮以从列表中删除项目

    我正在尝试制作一个删除按钮 该按钮将从 order List 中删除项目 我制作的 removeButton 按钮仅从列表中删除一项 然后会显示错误消息 menulist listOrder new menulist order List
  • is not null 和 <>' ' 之间有什么区别

    看看我的例子 两个代码有什么区别 Select name from customers where name is not null Select name from customers where name lt gt 他们做完全不同的事
  • 在 DOM 对象上设置属性时如何避免 no-param-reassign

    我有一个方法 其主要目的是在 DOM 对象上设置属性 function el el expando 我使用 AirBnB 的代码风格 这使得 ESLint 抛出一个no param reassign error 错误分配给函数参数 el n
  • 受保护的构造函数和可访问性

    如果子类位于不同的包中 为什么我们不能使用受保护的构造函数实例化一个类 如果可以访问受保护的变量和方法 为什么相同的规则不适用于受保护的构造函数 pack1 package pack1 public class A private int
  • 此处不应引用 Java 方法

    究竟如何使用 Java 8 链接实例的方法引用 例子 Collections sort civs Comparator comparing Civilization getStrategy getStrategLevel getStrate
  • 为什么继承的接口无法在通用上下文中转换为其基接口?

    我正在尝试在我的 C 项目中实现接口继承系统 但无法让它工作 这是一个简化版本 public interface BaseInterface public abstract class AbstractClass