更改方法重写中的参数修饰符

2024-01-11

我知道一个params修饰符(将数组类型的一个参数转换为所谓的“参数数组”)特别不是方法签名的一部分。现在考虑这个例子:

class Giraffid
{
    public virtual void Eat(int[] leaves)
    {
        Console.WriteLine("G");
    }
}
class Okapi : Giraffid
{
    public override void Eat(params int[] leaves)
    {
        Console.WriteLine("O");
    }
}

编译时没有任何警告。然后说:

var okapi = new Okapi();
okapi.Eat(2, 4, 6);  // will not compile! 

给出一个错误(No overload for method 'Eat' takes 3 arguments).

现在,我知道编译器会翻译params修改器到应用程序中System.ParamArrayAttribute到有问题的参数上。一般来说,将一组属性应用于虚拟方法的参数,然后使用一组不同的属性装饰派生类中的重写方法中的“相应”参数,这是没有问题的。

然而编译器选择忽略我的params默默地关键词。相反,如果反过来,并应用params到基类中的参数Giraffid,然后省略覆盖中的关键字Okapi,编译器选择装饰both方法与System.ParamArrayAttribute。当然,我用 IL DASM 验证了这些事情。

我的问题:

这是有记录的行为吗?我彻底搜索了 C# 语言规范,但没有找到任何提及这一点的内容。

我可以说至少Visual Studio开发环境对此感到困惑。当输入2, 4, 6在上面的方法调用中,智能感知向我展示void Okapi.Eat(params int[] leaves)在提示中.


为了进行比较,我还尝试实现接口方法并更改存在/不存在params在接口和实现类中,我尝试定义委托类型并更改params或者不在委托类型定义或我将其方法组分配给委托类型的变量的方法中。在这些情况下,完全有可能改变params-ness.


编译器的行为是正确的,但这有点混乱。我希望这至少是一个警告。

毫不奇怪,您在规范中找不到它说这是正确的地方。相关位是:

M(A) 形式的方法调用的绑定时处理(其中 M 是方法组,A 是可选参数列表)由以下步骤组成: 构造方法调用的候选方法集。对于与方法组 M 关联的每个方法 F,如果 F 是非泛型,则当 M 没有类型参数列表时 F 是候选方法,并且 F 对于 A 是适用的。

什么是“与方法组 M 相关的方法”?好吧,首先,什么是方法组?

方法组,是由成员查找产生的一组重载方法...

好的,那么成员查找规则是什么呢?

否则,该集合由 T 中所有名为 N 的可访问成员组成,包括继承成员和 object 中名为 N 的可访问成员。包含覆盖修饰符的成员将从集合中排除。

添加了强调。

这里的实际结果是出于重载决议的目的,重写的方法被认为是被重写的方法最初宣布的,不是以前的方法压倒性的.不幸的是,在这种情况下,这条规则被违反了:

virtual void M(int x, int y) { }
...
override void M(int y, int x) { } 
...
M(x = 1, y = 2);

重载解析使用names来自更多派生版本。这是命名参数在游戏后期添加的不幸后果。

简而言之:为了确定一个方法是否是“params”,分析是在原始方法,不在覆盖方法.

如果编译器在这里给你一个警告就好了。

可以说至少Visual Studio开发环境对此感到困惑

正确的。 IntelliSense 层始终显示重写方法的方法信息,而不是被重写的方法。研究表明,当方法看起来像是最初声明的方法而不是重写方法时,用户会感到困惑。当然,正如我之前提到的,这些是您将用于命名参数的参数名称。

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

更改方法重写中的参数修饰符 的相关文章

随机推荐

  • 如何恢复 iOS Simulator 5.1 周围的 iPad 边框?

    通过 Xcode 4 3 1 Apple 发布了新的 iOS 5 1 模拟器 不幸的是 当您运行 iPad 硬件时 SIM 窗口周围不再有 iPad 框架 有谁知道如何恢复该框架 我经常使用模拟器通过屏幕共享向其他人演示功能 当它在 iPa
  • 问题:软锁定缓存条目已被底层 Ehcache 过期

    我收到警告 但我不知道该怎么办 每次被禁止的 IP 更新时 大约有 80000 个条目将此警告写入 tomcat 中的 catalina out 日志文件中 WARNING Cache package BannedIP Key packag
  • Shell 脚本调试帮助 - 遍历目录中的文件

    bin sh files ls myDir myDir2 myDir3 for file in files do echo file java myProg file another directory done 我想做的是迭代 myDir
  • Delphi 中的任何 Asn1 实现

    Delphi 中是否有任何不错的 asn1 实现或库 Try StreamSec ASN 1 工具 http www streamsec com products stasn1 asp 它们也出现在合作伙伴 DVD 中
  • 当值相等时,Angular 和 NGRX 防止选择器在状态更改时发出相同的值

    我正在寻找一种解决方案 使我的选择器仅在与上次发出的值相比发生变化时才发出新值 而不仅仅是对商店的引用发生变化 我的商店有以下状态 items loading false selectedItemId 1 我有以下选择器 export co
  • 填补D3数组嵌套的空白

    我有一个由日期和一些值组成的数组或对象 var flatData date 2012 05 26 product apple date 2012 07 03 product orange 我正在尝试使用 d3 nest 按年然后按月获取这些
  • appcompat_v7 和fragment_main.xml?

    我最近将 eclipse 和 ADT 插件从 v22 3 更新到 v22 6 并发现了一些重大变化 每当我创建一个新的 Android 应用程序项目时 都会出现一个新的 appcompat v7 库 该库在 v22 3 插件上不存在 并且还
  • jQuery / DataTables:如何更改分页颜色

    我正在使用 jQuery DataTables 插件 版本 1 9 4 并且想更改分页的颜色 使用 CSS 我可以更改它们的背景颜色 但我找不到更改锚标记的字体颜色和字体悬停颜色的方法 我想将以下所有锚标记的字体颜色和悬停字体颜色更改为白色
  • OpenAI:流中断(客户端断开连接)

    我正在尝试 OpenAI 我已经准备好了训练数据 并使用fine tunes create 几分钟后 显示Stream interrupted client disconnected openai api fine tunes create
  • 使用参数设置 Jenkins Pipeline 构建

    我阅读了大量有关 Jenkins 2 x 和管道系统的内容 以便创建具有以下功能的设置 SCM 管理 Jenkinsfile 构建对 git 存储库的每个提交 通过 webhook 触发器传递参数 到目前为止 由于各种原因 我未能建立一个工
  • 如何在asp.net MVC视图中有条件地设置模型?

    我是 ASP NET MVC 的初学者 我的页面有一个名为 Navigation 的部分视图 我正在重复使用它 如果用户位于 主页 a 导航的 href 需要指向 字符 如果用户位于 服务 页面 则导航的 href 需要指向其他 url 例
  • 如何VBA捕获请求超时错误?

    我正在使用对象MSXML2 ServerXMLHTTP60 http msdn microsoft com en us library ms762278 28v vs 85 29向网络服务发送请求 有了这个对象 我可以通过以下方式加快数据加
  • Safari 扩展截屏

    我正在开发 Safari 浏览器扩展 它应该具有截图功能 Chrome 和 Firefox 有自己的 api 来获取当前窗口文档的 SS 我找不到任何特定于 Safari 的 API 文档 窗口和选项卡 API https develope
  • RGB 颜色不正确 Unity C#

    所以我有一个 2D 对象 您可以使用按钮更改颜色 每个按钮都会更改对象的精灵 我有一个红色 橙色 黄色 绿色 蓝色 紫色的精灵 现在我有一个粒子系统 前面提到的对象的子对象 我想将其 startColor 属性更改为与 2D 对象的精灵相同
  • Scipy.cluster.hierarchy.fclusterdata + 距离测量

    1 我正在使用 scipy 的 hcluster 模块 所以我可以控制的变量是阈值变量 我如何知道每个阈值的表现 即在 Kmeans 中 该性能将是所有点到其质心的总和 当然 这必须进行调整 因为通常更多的簇 更短的距离 我可以用 hclu
  • TortoiseMerge 中的等号是什么意思?

    In TortoiseMerge 文档 http tortoisesvn net docs release TortoiseMerge en tmerge dug icons html 等号的意思是 通过恢复到该行的原始内容 已撤消更改 该
  • 对 AngularJS $window 服务进行单元测试

    我想对以下 AngularJs 服务进行单元测试 factory httpResponseInterceptor q location window CONTEXT PATH function q location window conte
  • Sencha Touch 2 事件:绘制与展示?

    我有一个关于show事件 在我的应用程序中我正在处理painted我的小组的事件是这样的 Ext define mvcTest controller Test extend Ext app Controller config refs pa
  • 在 ie 8 中打印浮点图

    我目前正在使用http www flotcharts org http www flotcharts org 对于一个绘图插件 我正在尝试实现从内容包围的页面上打印流程图的能力 我正在尝试打开一个新窗口并打印一个画布对象 这样我就可以只打印
  • 更改方法重写中的参数修饰符

    我知道一个params修饰符 将数组类型的一个参数转换为所谓的 参数数组 特别不是方法签名的一部分 现在考虑这个例子 class Giraffid public virtual void Eat int leaves Console Wri