thể trùng lặp:
C# optional parameters on overridden methodsBạn có thể giải thích cho tôi hành vi kỳ lạ này của C# với các đối số tùy chọn không?
Đây là sản phẩm của đoạn mã sau:
Peter: -1
Peter: 0
Fred: 1
Fred: 1
Bạn có thể giải thích cho tôi tại sao tiếng gọi của Peter p.TellYourAge()
và p.DoSomething()
không phải là giống hệt nhau?
Đây mã để thử nó cho mình (VS2010 và FW 4):
static void Main(string[] args)
{
Peter p = new Peter();
p.TellYourAge(); // expected -1, result: -1
p.DoSomething(); // expected -1, result: 0
Fred f = new Fred();
f.TellYourAge(1); // expected 1, result: 1
f.DoSomething(); // expected 1, result: 1
Console.ReadKey();
}
}
public abstract class Person
{
public abstract void TellYourAge(int age); // abstract method without default value
}
public class Peter : Person
{
public override void TellYourAge(int age = -1) // override with default value
{
Console.WriteLine("Peter: " + age);
}
public void DoSomething()
{
TellYourAge();
}
}
public class Fred : Person
{
public override void TellYourAge(int age) // override without default value
{
Console.WriteLine("Fred: " + age);
}
public void DoSomething()
{
TellYourAge(1);
}
}
đoán đầu tiên của tôi là kể từ int là không nullable đây: public override void TellYourAge (int age = -1) // ghi đè lên với giá trị mặc định, nó mặc định luôn là 0 ... – mservidio
@mservidio Nhưng đó là lý do tại sao bạn chỉ định giá trị mặc định –
Bạn có thể quan tâm đến [bài viết này] (http://blogs.msdn.com/b/ericlippert/archive/2011/05/09/optional-argument-corner-cases-part-one. aspx) của Eric Lippert. Mặc dù nó không mô tả chính xác trường hợp tương tự, nó sẽ cung cấp cho bạn một số manh mối về những gì đang xảy ra. –