C#方法重载取决于签名或参数数量

本文关键字:参数 数数 方法 重载 取决于 | 更新日期: 2023-09-27 18:21:19

请指导我C#方法重载:它取决于方法签名、返回类型还是参数数量?要说明一个方法正在过载或可能过载,哪些更改是必不可少的?

感谢

C#方法重载取决于签名或参数数量

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

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

重载会考虑数字、顺序和参数的类型。返回类型不考虑用于过载目的

注意,有一个例外:如果某个方法在某个类中被重写,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)

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

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

创建重载方法而言,参数名称和"可选性"不相关,因此例如这是无效的:

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

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

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

例如,下面的3个被认为是过载的,第四个不会被认为是重载的,如果存在其他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修饰符