为什么重载方法的优先级低于实例方法

2024-03-08

我有基础班A

public class A
{
    public virtual void Method(A parameter)
    {
        Console.WriteLine(MethodBase.GetCurrentMethod());
    }
    public virtual void Method(B parameter)
    {
        Console.WriteLine(MethodBase.GetCurrentMethod());
    }
}

遗传B

public class B : A
{
    public virtual void Method(object parameter)
    {
        Console.WriteLine(MethodBase.GetCurrentMethod());
    }

    public override void Method(A parameter)
    {
        Console.WriteLine(MethodBase.GetCurrentMethod());
    }

    public override void Method(B parameter)
    {
        Console.WriteLine(MethodBase.GetCurrentMethod());
    }
}

静态类S用扩展方法

public static class S
{
    public static void Method(this B instance, B parameter)
    {
        Console.WriteLine(MethodBase.GetCurrentMethod());
    }
}

我们创建类型实例的示例B并调用Method对此,我们预计它将是public override void Method(B parameter)实际结果是public virtual void Method(object parameter).

var b = new B();
b.Method(new B()); // B.Method (Object parameter) Why???

为什么编译器不选择更合适的方法???UPD为什么它不是扩展方法?


为什么编译器不选择更合适的方法?

因为它遵循语言规范的规则,任何候选方法最初宣布的在查找候选方法时,基类中的(如果它们在派生类中被重写)将被忽略,除非派生类没有任何适用的方法,此时搜索将向上移动到基类等。

This is 旨在避免“脆弱的基类”问题 http://blogs.msdn.com/b/ericlippert/archive/2007/09/04/future-breaking-changes-part-three.aspx,但我发现面对派生类中被重写的方法,这很难接受。

C# 4 规范的相关位是 7.4,其结尾如下:

对于类型参数和接口以外的类型中的成员查找,以及严格单继承的接口中的成员查找(继承链中的每个接口恰好有零个或一个直接基接口),查找规则的效果就是派生的成员隐藏具有相同名称或签名的基本成员。

编辑:关于扩展方法...

为什么它不是扩展方法?

来自规范第 7.6.5.2 节:

在其中一种形式的方法调用(第 7.5.5.1 节)中

expr . identifier ( )
expr . identifier ( args )
expr . identifier < typeargs > ( )
expr . identifier < typeargs > ( args )

如果调用的正常处理没有找到适用的方法,则会尝试将该构造作为扩展方法调用进行处理

所以一个扩展方法是only基本上用作最后的手段。

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

为什么重载方法的优先级低于实例方法 的相关文章

  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • VB.NET 中的静态方法实现

    我很困惑Static在 VB NET 中的实现 在 C 中 我们可以创建静态类和静态方法来为我们的应用程序编写实用方法 现在 VB NET 让我们创建Module代替静态类 如果我们在模块中创建一个方法 默认情况下它会变成静态的 但在我的应
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • Hudson 和 Maven 的双单元测试报告

    我在 hudson 有一个 maven2 项目 当 cobertura 报告插件运行时 它会导致单元测试显示它们已经运行了两次 我不介意它们运行多次 但趋势图显示的测试数量是我们实际运行的两倍 有没有办法确保图表只显示一次 thanks J
  • Oracle 中的截断表出现错误

    我遇到的问题是 当我在 Oracle 中运行以下命令时 遇到错误 Truncate table mytable Errors ORA 02266 unique primary keys in table referenced by enab
  • 眼镜检测

    我想做的是测量眼镜框的厚度 我有一个想法来测量框架轮廓的厚度 可能是更好的方法 到目前为止 我已经勾勒出眼镜框的轮廓 但线条不相交处存在间隙 我考虑过使用 HoughLinesP 但我不确定这是否是我需要的 到目前为止 我已执行以下步骤 将
  • 来自私有 GitHub 存储库的 Cordova 插件

    从私有 GitHub 存储库安装 Cordova 插件的首选方法是什么 我从供应商处购买了一个私有插件 该供应商授予我的 git 帐户访问其私有 git 存储库的权限 通常我从 cordova cli 安装插件 cordova plugin
  • 如何比较两个数组,删除相似的项目,而不迭代整个数组?

    是否可以比较两个数组并删除相等的值 如果它们位于相同的索引 而不需要迭代两个数组 这是一个例子 array1 1 2 3 4 5 6 7 23 44 array2 1 1 3 4 5 7 6 23 45 array3 sudo compar
  • 提供 if 语句问题的函数返回

    我在从 golang 的 if 语句中返回函数的预期返回语句时遇到问题 我提供了以下代码 package main import fmt func random string var x return if x return return
  • 生命周期困境与另一项活动的方向变化

    我在 tabhost 中有 2 项活动 在 Activity1 中 我处理方向变化以及用户在 Activity 之间切换时的情况 当用户从 Activity1 切换到 Activity2 通过选项卡选择 执行方向更改 然后切换回 Activ
  • 限制 python 程序的 RAM 使用

    我试图将 Python 程序的 RAM 使用量限制为一半 这样当使用所有 RAM 时它就不会完全冻结 为此我使用了以下代码 该代码不起作用 并且我的笔记本电脑仍然冻结 import sys import resource def memor
  • Haskell 中的“子类化”显示?

    可以说我有以下内容 data Greek Alpha Beta Gamma Phi deriving Show 我想使用除 Beta 之外的所有项目的默认显示 我想说 两个 我可以这样做吗 deriving Show使用标准实例化机制 简单
  • 如何在 Safari 中打开 url 并返回到 Xcode 7 中 UITests 下的应用程序?

    这是我的自定义视图 LondonStreet 是一个按钮 当我点击该按钮时 我会获取 url 并在 Safari 中打开它 它有效 然后我可以返回 使用 Back to Wishlist 按钮 它也有效 问题是当我尝试在 UITests 下
  • 如何设置 select2 下拉列表的最小宽度和最大宽度?

    我在响应式 div 中有一个 select2 下拉菜单 该 div 还有一个侧边栏元素 列 其中包含用户从下拉列表中进行的选择 他们可以选择一个选项并将其添加到侧边栏 一切正常 但我在下拉菜单中有一个很长的选项 如果用户选择此选项 则父 d
  • Woocommerce Checkout:在国家/地区下拉列表中添加占位符[重复]

    这个问题在这里已经有答案了 在我的 Woocommerce Shop 结账处有一个下拉菜单 可以选择您所在的国家 地区 默认情况下 美国已被自动选择 如何只使用 选择您所在国家 地区 的占位符 我找不到这个主题的任何解决方案有人有什么想法吗
  • 以编程方式编辑 Google 电子表格

    我编写了一个接受用户输入的程序 但现在我希望能够通过在每次用户提交表单时编辑 Google 电子表格来保存该输入 基本上 Google 电子表格会不断更新 谁能提供有关我如何实现这一目标的教程 我正在使用 Eclipse 用 Ja va 进
  • 如何在 Windows 上控制 Python 的交互式控制台输入/输出?

    我需要控制一个Windows程序 它通过调用直接从控制台读取输入 kbhit and getch from
  • 如何将列表框的值从jsp传递到servlet?

    我的 JavaScript 是 function takeListBoxValue document frmPartnerList submit var selectArray new Array for i 0 i lt partnerL
  • javascript中的${variable}是什么[重复]

    这个问题在这里已经有答案了 我见过使用 startX startY 在 JavaScript 中 这对我来说是全新的 我喜欢使用它的想法 但不知道这是证明 let cumulativePercent 0 function getCoordi
  • 如何更新 PyInstaller 生成的 exe 详细信息?

    我已经使用 PyInstaller 创建可执行文件并想要更新 exe 详细信息 例如File description File version 下面是我用过的命令 PyInstaller onefile icon favicon ico m
  • 我的 Docker 无法在 Windows 10 Pro 上启动

    我在 Windows 10 专业版 PC 上设置 Docker 时遇到了一些问题 当我尝试打开它时 我收到此崩溃报告 崩溃报告截图 https i stack imgur com uwkDZ png 这是框内的文字 System Inval
  • 使用sql递归计算形成树

    我正在解决一个简单的问题 并想使用 SQL 来解决它 我有 3 个表 Category Item 和一个关系表 CategoryItem 我需要返回每个类别的项目计数 但问题是类别按父子关系排列 并且子类别中的项目计数应添加到其父类别中的计
  • 为什么重载方法的优先级低于实例方法

    我有基础班A public class A public virtual void Method A parameter Console WriteLine MethodBase GetCurrentMethod public virtua