请指导我使用C#方法加载:是否依赖于方法签名,返回类型或参数个数?说方法正在或可能超载会有什么变化?
由于
答案 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修饰符。