C#中的方法签名

Usm*_*man 35 c#

以下是什么是方法签名?

int DoSomething(int a, int b);
Run Code Online (Sandbox Code Playgroud)

返回类型是签名的一部分或不?

ean*_*533 70

返回类型不是C#中方法签名的一部分.只有方法名称及其参数类型(而不是参数名称)才是签名的一部分.例如,你不能有这两种方法:

int DoSomething(int a, int b);
string DoSomething(int a, int b);
Run Code Online (Sandbox Code Playgroud)

需要明确的是:方法不能根据其返回类型重载.它们必须具有唯一名称,唯一参数类型,或以不同方式传递其参数(例如,使用outref).

编辑:要回答原始问题,方法的方法签名是:

DoSomething(int, int)
Run Code Online (Sandbox Code Playgroud)

请注意,这一切都适用于常规方法.如果你在谈论delegates,那么你应该看看keyboardP的答案.(简短版本:返回类型IS代表签名的一部分).


Eri*_*ert 46

返回类型是否是签名的一部分?

这取决于你提出问题的原因.你为什么在乎?

方法签名有两种定义.C#语言的定义并没有包括返回类型,并使用该方法的签名,以确定两个重载是否是允许的.一种类型中不允许使用两种具有相同签名的方法.由于C#不认为返回类型是签名的一部分,因此C#不允许两个仅在返回类型上有所不同的方法在同一类型中声明.

但是,CLR确实包含签名中的返回类型.CLR允许两种方法属于同一类型,仅在返回类型上有所不同.

更具体一点:在C#中,签名包含以下方法:

  • 名称
  • 类型参数的数量
  • 正式参数的数量
  • 每个形式参数的类型
  • 每个形式参数的out/ref/value-ness

以下附加说明:

  • 泛型类型参数约束不是签名的一部分
  • 返回类型不是签名的一部分
  • 类型参数和形式参数名称不是签名的一部分
  • 两种方法可能不会仅仅在out/ref中有所不同

在CLR中,签名包括:

  • 名称
  • 类型参数的数量
  • 正式参数的数量
  • 每个形式参数的类型,包括modopts和modreqs
  • 返回类型包括modopts和modreqs
  • 每个形式参数的ref/value-ness

请注意,在考虑签名时,CLR根本不区分"ref int"和"out int".请注意,CLR 确实区分modopt/modreq类型.(C#编译器处理modopt/modreq类型的方式过于复杂,无法在此总结.)

  • @LucaCremonesi:完全没有.过载分辨率不是CLR的功能.重载分辨率是*languages*的一个特性,而不是*运行时*. (6认同)
  • 我一直在谷歌搜索,没有发现为什么C#团队决定返回类型不是签名的一部分?只有性能问题?你能说清楚吗?TKS (4认同)
  • @ wishmaster35:如果你的方法有签名`string F <T>(int x)`那么`x`是*形式参数*而``T`是*type参数*而``int`是*形式参数类型*.当你调用它时:`F <double>(123)`那么123是*参数*或*实际参数*,而`double`是*type参数*. (3认同)
  • @mmhasannn:重载必须在签名上有所不同.如果返回类型是签名的一部分,那么您可以使用两种方法,这些方法仅在返回类型上有所不同.这大大超出了重载分辨率的复杂性. (2认同)

Sea*_*n U 13

来自MSDN:

方法的签名包括方法的名称以及每个形式参数的类型和种类(值,引用或输出),按从左到右的顺序考虑.方法的签名特别不包括返回类型

编辑:这是来自旧文档.从那时起,"签名"的定义似乎发生了变化.现在,一个方法有两个不同的签名,一个用于重载,另一个用于确定委托兼容性.有关详细信息,请参阅下面的keyboardP的答案.


key*_*rdP 13

来自MSDN:

出于方法重载的目的,方法的返回类型不是方法签名的一部分.但是,在确定委托与其指向的方法之间的兼容性时,它是方法签名的一部分.

为了澄清,在您的示例中,返回类型不是签名的一部分.但是,当您匹配代理的签名时,它将被视为签名的一部分.来自MSDN:

可以将任何与委托签名匹配的方法(包括返回类型和参数)分配给委托.这使得可以以编程方式更改方法调用,并将新代码插入现有类中.只要您知道代理人的签名,就可以分配自己的委托方法.

所以我相信它是基于背景的.大多数情况下,如您的代码所示,返回类型不是它的一部分.但是,在授权的背景下,它被认为是其中的一部分.


Dar*_*der 5

DoSomething(int a, int b);
Run Code Online (Sandbox Code Playgroud)

是方法签名,

int 是返回类型.

看看这个:签名和重载