【发布时间】:2012-01-24 11:10:37
【问题描述】:
请指导我使用 C# 方法重载:它取决于方法签名、返回类型或参数数量吗?要说一个方法正在或可以被重载,哪些变化是必不可少的?
谢谢
【问题讨论】:
标签: c# .net oop polymorphism overloading
请指导我使用 C# 方法重载:它取决于方法签名、返回类型或参数数量吗?要说一个方法正在或可以被重载,哪些变化是必不可少的?
谢谢
【问题讨论】:
标签: c# .net oop polymorphism overloading
这取决于签名 - 即参数的数字和类型。
你可以有不同的重载,参数数量相同,但类型。例如,请参阅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 的被称为重载,而第 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)
根据MSDNSignatures and overloading (C#):
方法的签名由方法的名称和每个形式参数的类型和种类(值、引用或输出)组成,按从左到右的顺序考虑。方法的签名明确地不包括返回类型,也不包括可能为最右边的参数指定的 params 修饰符。
【讨论】: