我有两个重载的方法MyMethod
。一个带有int
作为参数,另一个带有long
。
从外部使用整数调用此方法将调用MyMethod(int)
成员。但是,如果覆盖了int
的方法,则会调用MyMethod(long)
。我不明白为什么dot.net会这样。有人可以解释技术背景吗?
对我来说,这似乎是个错误。
示例 1。和 3。(请参见下面的代码)的行为与我期望的一样。但是 2。我无法解释为什么代码会调用long方法。
// 1. Normal Overloading
class Program
{
static void Main(string[] args)
{
int value = 123;
new MyClass().MyMethod(value);
// Output: Method INT
Console.ReadKey();
}
}
class MyClass
{
public void MyMethod(int value)
{
Console.WriteLine("Method INT");
}
public void MyMethod(long value)
{
Console.WriteLine("Method LONG");
}
}
// 2. Combine Overriding with Overloading
class Program
{
static void Main(string[] args)
{
int value = 123;
new MyChildClass1().MyMethod(value);
// Output: Method LONG
Console.ReadKey();
}
}
class MyParentClass
{
public virtual void MyMethod(int value)
{
Console.WriteLine("Method INT");
}
}
class MyChildClass1 : MyParentClass
{
public override void MyMethod(int value)
{
Console.WriteLine("Method INT");
}
public void MyMethod(long value)
{
Console.WriteLine("Method LONG");
}
}
// 3. Inherit but use New for overloading
class Program
{
static void Main(string[] args)
{
int value = 123;
new MyChildClass2().MyMethod(value);
// Output: Method INT
Console.ReadKey();
}
}
class MyParentClass
{
public virtual void MyMethod(int value)
{
Console.WriteLine("Method INT");
}
}
class MyChildClass2 : MyParentClass
{
public new void MyMethod(int value)
{
Console.WriteLine("Method INT");
}
public void MyMethod(long value)
{
Console.WriteLine("Method LONG");
}
}
答案 0 :(得分:1)
这不是错误,是有计划的行为(但我同意,这尤其与其他示例相比有点令人困惑)。来自here:
这种行为的一方面特别令人惊讶。什么算作在类中“声明”的方法?事实证明,如果您在子类中重写基类方法,则不算是声明该方法。