为什么 C# 编译器在静态方法调用实例方法时不会出现错误代码?

2024-01-27

下面的代码有一个静态方法,Foo(),调用实例方法,Bar():

public sealed class Example
{
    int count;

    public static void Foo( dynamic x )
    {
        Bar(x);
    }

    void Bar( dynamic x )
    {
        count++;
    }
}

它编译时没有错误*,但在运行时生成运行时绑定器异常。正如预期的那样,删除这些方法的动态参数会导致编译器错误。

那么为什么拥有动态参数就可以编译代码呢? ReSharper 也不会将其显示为错误。

Edit 1:*在 Visual Studio 2008 中

Edit 2: added sealed因为子类可能包含静态Bar(...)方法。当不可能在运行时调用除实例方法之外的任何方法时,即使密封版本也会编译。


更新:以下答案写于2012年,在引入 C# 7.3 之前(2018 年 5 月). In C# 7.3 中的新增功能 https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-7-3, 这部分改进的过载候选者第 1 项,解释了重载解析规则如何更改,以便尽早丢弃非静态重载。因此,下面的答案(以及整个问题)现在大多只有历史意义!


(C# 7.3 之前的版本:)

由于某种原因,重载解析总是找到最佳匹配before检查静态与非静态。请尝试使用所有静态类型的代码:

class SillyStuff
{
  static void SameName(object o) { }
  void SameName(string s) { }

  public static void Test()
  {
    SameName("Hi mom");
  }
}

这不会编译,因为最好的重载是采用string。但是,嘿,这是一个实例方法,所以编译器会抱怨(而不是采用第二好的重载)。

添加:所以我认为的解释dynamic原始问题的例子是,为了保持一致,当类型是动态的时,我们也first找到最佳重载(仅检查参数数量和参数类型等,而不是静态与非静态),并且仅then检查静电。但这意味着静态检查必须等到运行时。因此观察到的行为。

后期添加:可以推断出他们为什么选择做这种有趣的顺序的一些背景埃里克·利珀特 (Eric Lippert) 的这篇博文 http://blogs.msdn.com/b/ericlippert/archive/2009/07/06/color-color.aspx.

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

为什么 C# 编译器在静态方法调用实例方法时不会出现错误代码? 的相关文章

  • Windows 上使用 g++ 的 Makefile,链接库

    我已经厌倦了 MSVC 6 以及每个人总是告诉我它是一个蹩脚的编译器等等 所以现在我决定尝试使用 vim 加 g 和 makefile 这是我的问题 我有以下 makefile This is supposed to be a commen
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 返回 int& 的函数[重复]

    这个问题在这里已经有答案了 我在网上查了一下发现一篇试图解释的文章std move和右值 http thbecker net articles rvalue references section 01 html并发现了一些我实在无法掌握的东
  • 关闭 XDOCUMENT 的实例

    我收到这个错误 该进程无法访问文件 C test Person xml 因为它是 被另一个进程使用 IOException 未处理 保存文件内容后如何关闭 xml 文件的实例 using System using System Collec
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 在“using”语句中使用各种类型 (C#)

    自从C usingstatements只是try finally dispose 的语法糖 为什么它接受多个对象仅当它们属于同一类型时 我不明白 因为它们需要的只是 IDisposable 如果它们都实现 IDisposable 应该没问题
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 如何不在类中实现接口的功能?

    面试时面试官问了我以下问题 但我不知道这个问题的答案是什么 请帮忙 如果我不想 我必须做什么 在我的类中实现一个函数 在接口中声明为 由我班实施 Edited 我正在使用 NET 和 C 如果有人可以提供 C 示例代码示例 那就太好了 Th
  • realloc():重新分配为 char * 上的 strcat 腾出空间时下一个大小无效 [重复]

    这个问题在这里已经有答案了 我在以下代码中收到无效内存错误 printf s n FINE 5 printf s LENGTH IS d n FINE 6 strlen buffer char realloc buffer strlen b
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • 有没有更好的方法来获取每个项目与谓词匹配的子序列?

    假设我有一个 IEnumerable 例如 2 1 42 0 9 6 5 3 8 我需要获得与谓词匹配的项目的 运行 例如 如果我的谓词是 bool isSmallerThanSix int number 我想得到以下输出 2 1 0 5
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • Javascript parseFloat 和 null

    我对 javascript 非常陌生 因为我目前正在 jQuery Mobile 中制作跨平台 Web 应用程序 我已经使用了 XML 解析到 HighCharts 图表的示例 但是当我在系列数据中遇到 null 时 它无法绘制任何线条并使
  • 颜色逐渐变化

    屏幕左上角的标志如何随着鼠标滑过而逐渐改变颜色 我认为它是用 jquery 完成的 如果您不知道代码 您能给我指点可以的教程吗 谢谢 http www shopdev co uk blog http www shopdev co uk bl
  • 即使进行所有优化,Android 模拟器也会出现延迟

    HAXM 启用版本 7 1 0 我验证了它在模拟器运行时正常工作 模拟器使用 Nvidia GPU 但在任何给定时间它仅使用最多 7 的 GPU 我有 27 3 1 的模拟器版本 最新 尝试过 x86 图像和 x86 x64 图像 我尝试过
  • 多个按钮上的 javascript 函数

    我有三个按钮 我希望它们在按下时改变颜色 并在再次按下时恢复为无颜色 我在 stackoverflow 上找到了这段代码 它几乎可以让我做到这一点 但是它只适用于一个按钮 其他两个不受影响 另外 当我按下另外两个按钮中的一个时 第一个按钮会
  • 如何在 mongodb 中更新多个数组元素

    我有一个 Mongo 文档 其中包含一个元素数组 我想重置 handled数组中所有对象的属性 其中 profile XX 该文件的形式如下 id ObjectId 4d2d8deff4e6c1d71fc29a07 user id 7146
  • 发帖后查看未更新

    我有一个控制器方法 CreateOrUpdate 该方法应该将汽车保存到数据库 然后正常返回 public ActionResult CreateOrUpdate int ID 0 Car car new Car ID HttpPost p
  • 如何测试 JSONObject 是否为空或不存在

    我有一套JSONObject我从服务器接收并操作的值 大多数时候我得到一个JSONObject带有一个值 比如说统计数据 有时 它返回一个Error带有代码和错误描述的对象 如何构建我的代码 使其在返回错误时不会中断 我以为我可以做到这一点
  • 非规范化是为了理智还是为了性能?

    我开始了一个新项目 他们有一个非常标准化的数据库 所有可以查找的内容都存储为查找表的外键 这是规范化的并且很好 但我最终为最简单的查询执行了 5 个表连接 from va in VehicleActions join vat in Vehi
  • 未找到 Laravel Passport 安装类

    我正在尝试配置我的 Laravel 应用程序以使用 Passport 但在加载 AppServiceProvider php 中的类时遇到了困难 这是我所做的
  • 为什么我的 MFC 应用程序在与两个滚动条交互后挂起?

    我正在开发一个 MFC 应用程序 在 Win10 下运行 其中包含一个图形 CAD 样式编辑器窗口 编辑器窗口包含用户可以重新定位和配置的图标 在包含许多元素的布局中 我们发现编辑器窗口可能会挂起长达 30 秒 这个问题是not当我们的大多
  • 使用 AngularJS 排除 url 中的路径

    我的角度应用程序有多个用户可以访问的页面 我想隐藏所有其他网址并仅向用户显示基本网址 因此 假设我的基本网址是 www example com 并且我还有其他页面 例如 关于 联系我们 等 目前 当用户单击 关于 时 网址将更改为 www
  • 本地通知

    本地通知可以在模拟器上运行吗 如果我关闭 而不是最小化 程序 本地通知会运行吗 是的 也是的 看 http iphonesdkdev blogspot com 2010 04 local push notification sample c
  • DataGrid 列标题与数据不对齐

    我有一个 DataGrid 就 DataGrid 而言它非常简单 由于某种原因 标题与其余数据不对齐 如下面的屏幕截图所示 我已经在互联网上搜索过 但似乎找不到解决方案 这是我的数据网格代码 Grid gt
  • 如何在不编译的情况下安装wkhtmltopdf补丁qt?

    我正在使用 google 云实例作为主机 Odoo somo 报告打印为 pdf 正常 但其他使用自定义纸张格式的会出现以下错误 开关 header spacing 不支持使用未打补丁的 qt 将被忽略 开关 header html 不支持
  • 在Python 3.0中动态向类添加方法

    我正在尝试用 Python 编写一个数据库抽象层 它允许您使用链式函数调用构建 SQL 语句 例如 results db search book author J K Rowling price lt 40 00 title Harry e
  • 使用 C 预处理器的嵌套宏迭代

    使用 C 预处理器 您可以拥有某种高阶宏 像这样的事情 define ABC f f a f b f c define XY f f x f y define CODE x foo x ABC CODE undef CODE define
  • BPF:程序上下文的翻译

    我正在研究不同类型的BPF程序 并注意到对于不同的程序类型 上下文的传递方式不同 Example 对于节目类型BPF PROG TYPE SOCK OPS 类型的对象struct bpf sock ops kern https elixir
  • 如何向 Grid.Mvc 添加导出功能,以便将当前搜索结果导出到 Excel?

    关于这个话题有几个问题https stackoverflow com questions 23498689 handle a pre filtered list with grid mvc https stackoverflow com q
  • 获取相对于文件开头的标记起始字符位置

    antlr4 API 有没有可靠的方法来获取相对于文件开头而不是行开头的令牌起始字符位置 经过一些研究后 我发现唯一的方法是使用 IntStream 的一些自定义实现 它不会将 n 视为行终止符 但也许我缺少一些更简单的方法 如果重要的话我
  • 为什么 C# 编译器在静态方法调用实例方法时不会出现错误代码?

    下面的代码有一个静态方法 Foo 调用实例方法 Bar public sealed class Example int count public static void Foo dynamic x Bar x void Bar dynami