C#方法重载取决于签名或参数数量
本文关键字:参数 数数 方法 重载 取决于 | 更新日期: 2023-09-27 18:21:19
请指导我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修饰符