- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我知道 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!
给出错误(方法“Eat”没有重载需要 3 个参数
)。
现在,我知道编译器将 params
修饰符转换为 System.ParamArrayAttribute
对相关参数的应用。通常,将一组属性应用于虚方法的参数,然后在派生类的重写方法中用一组不同的属性修饰“相应”参数是没有问题的。
然而,编译器选择默默地忽略我的 params
关键字。相反,如果反过来,将 params
应用于基类 Giraffid
中的参数,然后在 Okapi 的 override 中省略关键字
,编译器选择用 System.ParamArrayAttribute
修饰两个方法。当然,我用 IL DASM 验证了这些事情。
我的问题:
这是记录在案的行为吗?我已经彻底搜索了 C# 语言规范,但没有找到任何提及。
我可以说至少 Visual Studio 开发环境对此感到困惑。在上述方法调用中键入 2, 4, 6
时,intellisense 会在提示中显示 void Okapi.Eat(params int[] leaves)
.
为了比较,我还尝试实现一个接口(interface)方法并更改接口(interface)和实现类中 params
的存在/不存在,我尝试定义一个委托(delegate)类型并更改 params
或不在委托(delegate)类型定义或其方法组中分配给我的委托(delegate)类型变量的方法。在这些情况下,完全可以更改 params
-ness。
最佳答案
编译器的行为是正确的,但这有点困惑。我希望这至少是一个警告。
毫不奇怪,您在规范中找不到它说这是正确的地方。相关位是:
The binding-time processing of a method invocation of the form M(A), where M is a method group, and A is an optional argument-list, consists of the following steps: The set of candidate methods for the method invocation is constructed. For each method F associated with the method group M, if F is non-generic, F is a candidate when M has no type argument list, and F is applicable with respect to A.
“与方法组 M 关联的方法”是什么?那么,首先,什么是方法组?
A method group, which is a set of overloaded methods resulting from a member lookup...
好的,那么成员查找规则是什么?
Otherwise, the set consists of all accessible members named N in T, including inherited members and the accessible members named N in object. Members that include an override modifier are excluded from the set.
添加了强调。
这里的实际结果是,出于重载决议的目的,被覆盖的方法被认为是最初声明的方法,而不是被覆盖. 不幸的是,在这种情况下违反了这条规则:
virtual void M(int x, int y) { }
...
override void M(int y, int x) { }
...
M(x = 1, y = 2);
重载解析使用来自更多派生 版本的名称。这是一个不幸的结果,因为命名参数是在游戏中很晚才添加的。
简而言之:为了确定一个方法是否为“params”,分析是在原始方法上进行的,而不是在覆盖方法上进行的。
如果编译器在这里给你一个警告就好了。
can say that at least the Visual Studio development environment is confused about this
正确。 IntelliSense 层始终显示重写方法的方法信息,而不是被重写的方法。研究表明,当方法看起来像是最初声明的方法而不是覆盖方法时,用户会感到困惑。当然,正如我之前提到的,这些是您要用于命名参数的参数名称。
关于c# - 在方法覆盖中更改 params 修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27843804/
我经常看到这个,但我一直不明白。为什么这么多函数在函数定义中有这些嵌套的括号和奇怪的逗号? 有点像 function name(param, param param) 对我来说有意义,或者 funct
为什么参数输入有两种不同的格式?除了个人品味之外,还有其他好处吗? 例如,我正在使用它,因为那是我第一次阅读有关Powershell的文档时所看到的 function MyAwesomeFunctio
当我转到角色 Controller 时,显示操作,所有正常的 params[:id] 都是根据 REST 应该如何。 在显示 View 中,我渲染了部分。在该部分中,我有一个指向 vote_socio
我正在尝试在我的 Express 应用程序中使用 Sequelize 获取数据,并使用 MSSQL 获取数据库。这是我的代码: getInstitution: function (req, res)
从 ASP.NET 中的代码隐藏访问表单或查询字符串值时,使用的优缺点是什么,例如: // short way string p = Request["param"]; 代替: // long way
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is it called when you use object… as a parameter? 我在
在代码示例中,我看到了以下代码: SomeClass.Columns(columns => { columns.Add() .Text("Product")
我是 PySpark 的初学者。我在 PySpark 中使用 FPgrowth 计算关联。我按照以下步骤操作。 数据示例 from pyspark.sql.session import SparkSe
我想记录一个类,我在 PyCharm 中看到当自动添加文档字符串时它会添加 :param param_name1: :param param_name2: 不过,我看到有人用 @param param
我正在为一个网站设计 Android 客户端。所以我必须实现很多不同的网络操作。例如用户授权或在服务器上搜索。为此,我必须向 REST Web 服务器发送带有一些参数和 URL 的 JSON 请求。因
我对 Jersey 和 Grizzly 有疑问。这个问题可能非常基本,但我正在努力解决它。我的想法是,我正在创建一个需要存储书籍的练习应用程序。一切似乎都很好,但并没有按预期进行。这是源代码: @Pa
假设我有一个带有虚方法的接口(interface),但参数之一是: virtual void Delete(ParentClass *parentClass) = 0; 如果我稍后在子类中实现它 vo
需要一些 Python 语法方面的帮助 伪代码 if param is not None in params, param replace('xx', 'x') 我走到这一步了: param.repl
我刚开始使用 JSDocs,找不到这个问题的答案。 假设我想写这个简单的函数: function hasQ(array, item) {return array.includes(item);} 对于
我对doInBackground(Params...params)中的参数语法不熟悉 这种东西叫什么,我该如何使用它? 最佳答案 正如 devA 和 VVV 所说,这就是所谓的“可变参数”。实际上,以
我很难在两个 perl 模块之间做出选择——Params::Validate 和 Params::Check。 我正在编写一个应该易于分发的 Mojolicious 应用程序。 一般来说,我的意思是在
这个问题已经有答案了: What does [param: NotNull] mean in C#? (2 个回答) 已关闭 7 年前。 我发现了以下属性声明。 [param: Marsha
我正在阅读有关 $params 的 CakePHP 手册,并且想知道每个参数的适当用法是什么?我知道返回的数组略有不同(“url”实际上有一个名为“url”的数组键,它返回 Controller /操
我见过处理 *param1 和 ¶m2 的 C 函数调用 func1(*param1); func2(¶m2); 我知道 * 和 & 必须与指针相关。那么这两种不同的方式有
特别是,为什么对 *param 这样的参数的更改不会传播回函数的调用者,但对 **param 这样的参数的更改却会传播回来? 最佳答案 在这两种情况下,更改都会被传播,但这取决于调用函数。 请参阅下面
我是一名优秀的程序员,十分优秀!