【发布时间】:2012-02-07 04:26:33
【问题描述】:
下面的方法签名是什么
int DoSomething(int a, int b);
返回类型是否是签名的一部分???
【问题讨论】:
标签: c#
下面的方法签名是什么
int DoSomething(int a, int b);
返回类型是否是签名的一部分???
【问题讨论】:
标签: c#
在方法具有泛型参数的情况下,对签名的理解变得更加混乱。
在类级别声明的泛型类型被视为普通类型。
但是在方法级别声明的泛型类型被视为方法的泛型参数中的索引。
例如,所有这些方法都有不同的签名。
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
}
【讨论】:
返回类型不是 C# 中方法签名的一部分。只有方法名称及其参数 types(但不包括参数 names)是签名的一部分。例如,您不能使用以下两种方法:
int DoSomething(int a, int b);
string DoSomething(int a, int b);
需要明确:方法不能根据返回类型进行重载。它们必须具有唯一的名称、唯一的参数类型或以不同的方式传递参数(例如,使用 out 或 ref)。
编辑:要回答您的原始问题,您的方法的方法签名是:
DoSomething(int, int)
请注意,这一切都适用于普通方法。如果您在谈论delegates,那么您应该看到keyboardP 的答案。 (简短版:返回类型是委托签名的一部分)。
【讨论】:
返回类型是否是签名的一部分?
这取决于你问这个问题的原因。你为什么在乎?
方法签名有两种定义。 C# 语言定义不 包含返回类型,并使用方法的签名来确定是否允许两个重载。一个类型中不允许有两个具有相同签名的方法。由于 C# 不将返回类型视为签名的一部分,因此 C# 不允许在同一类型中声明仅返回类型不同的两个方法。
但是,CLR 确实在签名中包含返回类型。 CLR 允许两个方法属于同一类型,仅返回类型不同。
更具体地说:在 C# 中,签名由方法组成:
带有以下附加说明:
在 CLR 中,签名包括:
请注意,CLR 在考虑签名时根本不区分“ref int”和“out int”。请注意,CLR 确实区分 modopt/modreq 类型。 (C# 编译器处理 modopt/modreq 类型的方式过于复杂,无法在此总结。)
【讨论】:
string F<T>(int x) 的方法,那么x 是正式参数,T 是类型参数 和int 是形参类型。当你调用它时:F<double>(123) 那么 123 是 argument 或 actual parameter,double 是 type argument。
来自MSDN:
方法的签名由方法的名称和每个形式参数的类型和种类(值、引用或输出)组成,按从左到右的顺序考虑。 方法的签名明确不包括返回类型
编辑:来自旧文档。从那以后,“签名”的定义似乎发生了变化。现在一个方法有两种不同的签名,一种用于重载,另一种用于确定委托兼容性。有关详细信息,请参阅下面的 keyboardP 的答案。
【讨论】:
签名不包含返回类型。既不是参数名称。在您的情况下,它将是 DoSomething(int, int)
【讨论】:
【讨论】: