2011-11-08 42 views
5

thể trùng lặp:
passing an empty array as default value of optional parameter in c#bộ khởi tạo mảng làm tham số trong C#

Mã này là đúng trong C# 4,0

static void SomeMethod(int x, int y = 5, int z = 7) 
{ 
} 
SomeMethod(1); 

nhưng khi áp dụng trên mảng nó mang lại cho tôi lỗi

private static void diagonalFill(int[,] a,int[] fillType = {0,-1},int[] diagFill = {-1,1}) 
    { 

    } 
    diagonalFill(array); 

Có ai có thể chỉ cho tôi đúng cách không? 10x

Trả lời

3

Giá trị tham số mặc định là không thể với các giá trị tham chiếu phức tạp. Việc đầu tiên hoạt động bởi vì các tham số là nguyên thủy được lưu trữ trên ngăn xếp và được sao chép theo giá trị . Mảng là các giá trị tham chiếu phức tạp, vì vậy chúng phải được phân bổ trước khi chúng có thể xuất hiện dưới dạng tham số.

Chỉnh sửa:
@Henk Nhận xét của Holterman được thực hiện tốt. Tôi không có kiến ​​thức trực tiếp về việc liệu ngăn xếp hoặc đống phân phối có hoạt động hay không vì vậy thông tin này bị nhầm lẫn hoặc gây nhầm lẫn. Các tiêu chí chính mà tôi biết là chỉ có thể sử dụng primitives types. Từ this document,

Giá trị mặc định phải là một trong các loại sau đây của các biểu thức:

  1. một biểu thức hằng;

  2. một biểu thức của biểu mẫu mới ValType(), trong đó ValType là giá trị loại, chẳng hạn như enum hoặc cấu trúc;

  3. một biểu thức mặc định biểu mẫu (ValType), trong đó ValType là giá trị .

Các "nguyên thủy" danh sách liên kết ở trên đã được sửa đổi cho năm 2010 được gọi là "tích hợp" các loại. Nó có thể là found here.

+0

chuỗi cũng được tham khảo các loại và chúng có thể được sử dụng như là giá trị mặc định tốt. Và ngăn xếp thực sự không đóng một vai trò ở đây. –

+0

@HenkHolterman: Đủ công bằng. Đó là bổ sung cho một cuộc trò chuyện tôi đã có với một ai đó và tôi không thể tìm thấy bất cứ điều gì để trở lại nó lên (cộng với những gì bạn nói âm thanh hợp lý). Tôi đã làm hỏng nó và cung cấp liên kết đến để hỗ trợ tuyên bố của tôi rằng các tham số phải là nguyên thủy (hoặc khi chúng được gọi là trong năm 2010 - được xây dựng trong các loại). –

3

Giá trị thông số mặc định phải là hằng số thời gian biên dịch, vì vậy bạn không thể thực hiện việc này.

2

Bạn không thể sử dụng trình khởi tạo làm mặc định.

Bạn có thể sử dụng:

private static void diagonalFill(int[,] a, 
     int[] fillType = null, 
     int[] diagFill = null) 
{ 
    if (fillType == null) 
    fillType = new int[] {0,-1}; 

    if (diagFill == null) 
    diagFill = new int[] {-1,1}; 

    ... 
} 
+0

giải pháp này tất nhiên phụ thuộc vào null không phải là một tùy chọn mà có bao giờ sẽ được thông qua như một tham số. – AndrewC

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