C#方法重载取决于签名还是参数个数?

时间:2012-01-24 11:10:37

标签: c# .net oop polymorphism overloading

请指导我使用C#方法加载:是否依赖于方法签名,返回类型或参数个数?说方法正在或可能超载会有什么变化?

由于

4 个答案:

答案 0 :(得分:3)

取决于签名 - 即参数的数字和类型

您可以使用相同数量的参数进行不同的重载,但具有不同的类型。例如,请参阅Convert类 - 带有一个参数的方法的许多重载,但每个重载采用不同的类型。

答案 1 :(得分:3)

重载会考虑数字,顺序和参数的类型。 返回类型不被视为超载目的

注意,有一个例外: 如果某个类中的方法被覆盖,则c#尝试首先在重写的类中找到兼容的版本,然后只查看祖先。 例如

Class A
{
  public virtual void SetProperty(string value)
  {
  }     
}

Class B: Class A
{
  public override void SetProperty(object value)
  {
  }
}

如果您执行以下操作

  var b= new B();
  b.SetProperty("hello"); // will resolve to overridden method in class B even though you have a more specific version in its parent (class A)

答案 2 :(得分:2)

如果您的意思是过载分辨率,则取决于:

  • 方法的名称:)
  • 参数数量
  • 参数类型
  • 参数的名称(如果您使用的是命名参数)
  • 参数是否可选
  • 类型参数的数量

创建重载方法而言,参数名称和“可选性”无关,所以例如这是无效的:

// Not valid: same signature
void M(int x, string y)
void M(int z, string a = "")

它们在方法名称,类型参数数量以及参数数量和类型方面具有相同的签名。

答案 3 :(得分:2)

如果参数的数量不同或参数的类型不同,则称一个方法被重载,但如果只有方法的返回类型不同(不能编译),则不能重载。

e.g。 3以下被认为是超载,第4个不会被称为超载,如果其他3个存在则不会编译:

public int Add(int a, int b); // Method 1, overloaded
public int Add(int a, int b, int c); // Method 2, overloaded
public int Add(double a, double b); // Method 3,  overloaded

public double Add(double a, double b); // Method 4 (invalid, will conflict with Method 3 above)

根据Signatures and overloading (C#)上的MSDN

方法的签名包括方法的名称以及每个形式参数的类型和种类(值,引用或输出),按从左到右的顺序考虑。方法的签名特别不包括返回类型,也不包括可以为最右侧参数指定的params修饰符。