2014-10-07 18 views
6

EDIT 1: Tôi biết có các lựa chọn thay thế như telescoping, đây là một câu hỏi thuần túy về giáo dục.Tại sao các tham số phương thức mặc định phải là hằng số biên dịch trong C#

Tôi biết điều này là đúng, nhưng tại sao phải vậy? Nó có vẻ như với một cái gì đó như thế này:

public class Foo{ 

    private int bar; 

    public void SetBar(int baz = ThatOtherClass.GetBaz(3)){ 
     this.bar = baz; 
    } 

} 

Trình biên dịch có thể thay đổi phương thức để một cái gì đó như thế này:

public void SetBar(int baz){ 

//if baz wasn't passed: 
baz = ThatOtherClass.GetBaz(3); 

this.bar = baz; 

} 

Tại sao không làm việc đó, hoặc sẽ nó, và nó chỉ là một quyết định thiết kế ?

+0

vì có thể có sự khác biệt giữa giá trị thời gian chạy và giá trị thời gian biên dịch. những gì nếu coder muốn một giá trị biên dịch thời gian "hardcoded" trong đó, nhưng GetBaz() sau đó trả về một cái gì đó hoàn toàn khác nhau tại thời gian chạy và ném chương trình ra khỏi Whack? –

+5

Nếu bạn muốn biết lý do tại sao nhóm ngôn ngữ C# không triển khai tính năng, hãy hỏi họ, thay vì các nhà phát triển ngẫu nhiên không liên quan gì đến việc tạo ngôn ngữ. Chúng tôi không thể biết tại sao họ chọn không triển khai tính năng này. – Servy

+1

bạn luôn có tùy chọn nạp chồng phương pháp –

Trả lời

7

Bởi vì spec nói như vậy:

Một cố định tham số với một mặc định đối số được biết đến như một tham số tùy chọn , trong khi một tham số cố định mà không có một mặc định đối số là một tham số cần thiết . Tham số bắt buộc có thể không xuất hiện sau thông số tùy chọn trong danh sách tham số chính thức. Tham số ref hoặc out không thể có đối số mặc định. Các biểu hiện trong một mặc định đối số phải là một trong những điều sau đây:

• một hằng số thể hiện

• một biểu thức có dạng S mới() trong đó S là một loại giá trị

• một biểu thức của biểu mẫu mặc định (S) trong đó S là một loại giá trị

Vì sao các nhà thiết kế ngôn ngữ lại chọn cách này mà chúng tôi chỉ có thể đoán được. Tuy nhiên, một mảnh của spec gợi ý câu trả lời:

Khi đối số được bỏ qua từ một thành viên chức năng tương ứng với thông số tùy chọn, các đối số mặc định của hàm tuyên bố thành viên được truyền ngầm. Bởi vì chúng luôn không đổi, đánh giá của chúng sẽ không ảnh hưởng đến thứ tự đánh giá của các đối số còn lại .

+0

yeah thats một điểm tốt, nếu bạn sử dụng phương pháp như giá trị mặc định của bạn mà trật tự nên những phương pháp được thực thi nếu bạn có nhiều hơn một giá trị mặc định và tại thời điểm đó –

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