2012-03-05 17 views
16

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()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); 
    } 
} 
+2

đ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

+2

@mservidio Nhưng đó là lý do tại sao bạn chỉ định giá trị mặc định –

+1

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. –

Trả lời

3

Nếu bạn tình cờ sử dụng Resharper, nó sẽ cung cấp cho bạn những cảnh báo sau đây/thông báo.

"Giá trị mặc định thông số tùy chọn khác với tuổi thông số trong khoảng trống phương thức cơ sở TellYourAge (int age)."

Tìm hiểu khi bạn kết hợp các giá trị tham số tùy chọn và kế thừa. Giá trị tham số mặc định được giải quyết tại thời gian biên dịch, không phải thời gian chạy. Mặc định thuộc về kiểu tham chiếu đang được gọi. Ở đây nó giải quyết cho kiểu Person và nó sử dụng giá trị mặc định của một số nguyên là 0, thay vì -1.

Bạn có thể tìm thấy một số thông tin về những cạm bẫy thường gặp liên quan đến thông số tùy chọn ở đây:

http://geekswithblogs.net/BlackRabbitCoder/archive/2010/06/17/c-optional-parameters---pros-and-pitfalls.aspx

Dễ dàng sửa chữa nếu bạn muốn sử dụng nó theo cách này. Xác định rõ ràng từ khóa 'this' khi gọi phương thức TellYourAge. Bằng cách này, giá trị mặc định mong muốn sẽ được xác định tại thời gian biên dịch.

public void DoSomething() 
{ 
    this.TellYourAge(); 
} 
+1

Tôi mong đợi một lỗi biên dịch hoặc cảnh báo trong trường hợp này, nhưng đó không phải là vấn đề. Rằng các tham số mặc định được giải quyết tại thời gian biên dịch cũng rõ ràng, nhưng không giải thích tại sao chính xác cùng một lời gọi đến TellYourAge() trên các kết quả p-instance ở đầu ra khác nhau. – X181

+0

Xem thêm http://blogs.msdn.com/b/ericlippert/archive/2011/05/09/optional-argument-corner-cases-part-one.aspx –

+1

Các chủ đề có liên quan, nhưng nó không trùng lặp. Trong trường hợp khác, giá trị mặc định được chỉ định được sử dụng. Trong trường hợp này, giá trị mặc định không xác định của loại được sử dụng. – X181

Các vấn đề liên quan