这里有许多正确的答案,它们将方法签名定义为方法名称、通用参数、形式参数参数以及形式参数类型和种类,而不是返回类型或“params”修饰符。
虽然这是正确的,但这里有一些微妙之处。C# 语言定义方法签名的方式与 CLR 定义方法签名的方式不同,这在C # 和其他语言之间进行互操作时可能会导致一些有趣的问题。
对于 CLR,方法签名由方法名称、泛型数量、形参数量、形参类型和种类以及返回类型组成。所以有第一个区别;CLR 考虑返回类型。
CLR 也不认为“out”和“ref”属于不同的形参类型;C# 可以。
CLR 还有一个有趣的特性,称为“可选和必需的类型修饰符”,通常称为“modopts”和“modreqs”。可以用另一种类型来注释方法签名中的类型,告诉您有关“主要”类型的信息。例如,在 C++ 中,这是两个不同的签名:
void M(C const & x);
void M(C & x);
两个签名都定义了一个方法 M,该方法采用“对 C 的引用”类型的参数。但是因为第一个是 const 引用而第二个不是,所以 C++ 语言认为这些是不同的签名。CLR 通过允许 C++/CIL 编译器为形式参数类型上的特殊“this is const”类型发出 modopt 来实现这一点。
没有办法在 C# 中读取或设置 mod,但 C# 编译器仍然知道它们并且会以某些方式尊重它们。例如,如果您在 C++/CIL 中声明了一个公共虚拟方法,例如:
void V(C const * x)
并且您在用 C# 编写的派生类中覆盖它,C# 编译器不会为您强制执行 const 正确性;C# 编译器不知道 const modopt 是什么意思。但是 C# 编译器将确保在 modopt 到位的情况下将覆盖方法发送到元数据中。这是必要的,因为 CLR 需要覆盖和覆盖方法的签名来匹配;编译器必须遵守 CLR 规则进行签名匹配,而不是 C# 规则。