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

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(使用前将#替换为@)

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

  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 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