C# C语言中的方法签名#

C# C语言中的方法签名#,c#,C#,下面的方法签名是什么 int DoSomething(int a, int b); 返回类型是否是签名的一部分???返回类型不是C#中方法签名的一部分。只有方法名及其参数类型(而不是参数名)是签名的一部分。例如,您不能使用以下两种方法: int DoSomething(int a, int b); string DoSomething(int a, int b); 需要明确的是:不能根据返回类型重载方法。它们必须具有唯一的名称、唯一的参数类型或以不同的方式传递参数(例如,使用out或ref)

下面的方法签名是什么

int DoSomething(int a, int b);

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

返回类型不是C#中方法签名的一部分。只有方法名及其参数类型(而不是参数名)是签名的一部分。例如,您不能使用以下两种方法:

int DoSomething(int a, int b);
string DoSomething(int a, int b);
需要明确的是:不能根据返回类型重载方法。它们必须具有唯一的名称、唯一的参数类型或以不同的方式传递参数(例如,使用
out
ref

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

DoSomething(int, int)
请注意,这一切都适用于常规方法。如果你说的是
delegate
s,那么你应该看到keyboardP的答案。(简短版本:返回类型是委托签名的一部分)

是方法签名

int
是返回类型

看看这个:

来自

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


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

签名不包含返回类型。两个参数的名称都不相同。在您的情况下,它将是
DoSomething(int,int)

来自:

方法的返回类型不是方法签名的一部分 用于方法重载的目的。然而,这是问题的一部分 在确定 委托及其指向的方法


为了澄清,在您的示例中,返回类型不是签名的一部分。但是,当您匹配代理的签名时,它被视为签名的一部分。发件人:

与委托签名匹配的任何方法,,包括 返回类型和参数,可以分配给代理。这 使以编程方式更改方法调用成为可能,并且 将新代码插入现有类。只要你知道 委托人的签名,您可以指定自己的委托方法

所以我相信这是基于上下文的。大多数情况下,正如代码中所示,返回类型不是它的一部分。然而,在授权方面,它被视为授权的一部分

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

这取决于你为什么问这个问题。你为什么在乎

方法签名有两种定义。C#语言定义不包括返回类型,并使用方法的签名来确定是否允许两个重载。类型中不允许有两个具有相同签名的方法。由于Cype不考虑返回类型作为签名的一部分,所以C不允许两种仅返回类型相同的方法被声明为同一类型。 但是,CLR在签名中确实包含返回类型。CLR允许两个方法在同一类型中,但返回类型不同

更具体地说:在C#中,签名包括以下方法:

  • 名字
  • 类型参数的数目
  • 形式参数的数目
  • 每个形式参数的类型
  • 每个形式参数的out/ref/value属性
随附以下附加说明:

  • 泛型类型参数约束不是签名的一部分

  • 返回类型不是签名的一部分
  • 类型参数和形式参数名称不是签名的一部分
  • 两种方法可能仅在out/ref中有所不同
在CLR中,签名包括:

  • 名字
  • 类型参数的数目
  • 形式参数的数目
  • 每个形式参数的类型,包括modopts和modreqs
  • 返回类型,包括modopts和MODREQ
  • 每个形式参数的参考值/值

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

在方法具有泛型参数的情况下,对签名的理解变得更加混乱

在类级别声明的泛型类型被视为普通类型

但在方法级别声明的泛型类型被视为方法泛型参数中的索引

例如,所有这些方法都有不同的签名

class MyClass<TValue>
{
    public void F(TValue v) { }       // generics: 0, arg: TValue
    public void F<X>(TValue v) { }    // generics: 1, arg: TValue
    public void F<X, Y>(TValue v) { } // generics: 2, arg: TValue

    public void F<X>(X v) { }    // generics: 1, arg: 0
    public void F<X, Y>(X v) { } // generics: 2, arg: 0
    public void F<X, Y>(Y v) { } // generics: 2, arg: 1
}
class-MyClass
{
公共void F(TValue v){}//泛型:0,arg:TValue
公共void F(TValue v){}//泛型:1,arg:TValue
公共void F(TValue v){}//泛型:2,arg:TValue
公共void F(xv){}//泛型:1,arg:0
公共void F(xv){}//泛型:2,arg:0
公共void F(Y v){}//泛型:2,arg:1
}

@adamjmarkham:只能在子类中重写时执行,而不是“取决于方法的作用”。我很确定返回类型不是签名的一部分。返回类型不是我学徒的方法签名的一部分。这个答案确实需要取消标记为已接受,因为它不正确。Eric Lippert下面的答案正确地定义了构成方法签名的元素。@0b101010我的答案中的所有内容实际上都是正确的。Eric的回答也是正确的,当然更全面(考虑到他的背景,这并不奇怪),但这并不意味着这个答案的准确性降低。@ean5533
class MyClass<TValue>
{
    public void F(TValue v) { }       // generics: 0, arg: TValue
    public void F<X>(TValue v) { }    // generics: 1, arg: TValue
    public void F<X, Y>(TValue v) { } // generics: 2, arg: TValue

    public void F<X>(X v) { }    // generics: 1, arg: 0
    public void F<X, Y>(X v) { } // generics: 2, arg: 0
    public void F<X, Y>(Y v) { } // generics: 2, arg: 1
}