2010-05-31 31 views
15

C# spec. cho phép bạn gọi một hàmGửi không đối số làm tham số - nơi hành vi được xác định?

void foo(params int[] x) 

với các tham số bằng không. Tuy nhiên, tôi không tìm thấy trong C# Lang. Spec. một từ về hành vi tiếp theo - sẽ foo nhận được mảng trống hoặc tham chiếu null? Tôi cũng đã kiểm tra MSDN - không có gì.

Trường hợp hành vi được xác định?

LƯU Ý: Tôi không hỏi cách ứng xử của VS, tôi hỏi về thiết kế ngôn ngữ.

Trả lời

21

Mục 7.4.1 của Đặc điểm kỹ thuật ngôn ngữ C#

Cụ thể, lưu ý rằng một mảng trống được tạo khi không có các đối số được cung cấp cho tham số mảng.

Đó là nghĩa đen dòng cuối cùng của bộ phận (C# 3.0 spec)

+0

MS cũng che giấu thông tin này, tôi đã kiểm tra phần params ;-) Thank you very much. – greenoldman

+0

Một giải pháp cho vấn đề này: Tạo phiên bản quá tải của hàm tạo/phương thức với đối số bằng không. Ví dụ: 'void foo()' và 'void foo (tham số int [] x)' – kevinarpe

+0

Cảm ơn. Đây là một liên kết mới sẽ trỏ đến những gì Anthoney đang đề cập đến. [Danh sách đối số -> đánh giá thời gian chạy của danh sách đối số] (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions#run-time-evaluation-of -argument-lists) – Darrelk

0

Đối với callee, nó bằng void foo(int[] x) và chuyển các thông số n sẽ cung cấp cho bạn một mảng với các yếu tố n. Vì vậy, các tham số bằng không sẽ được dịch thành một int [0].

13

17.5.1.4 mảng Parameter

Một mảng tham số cho phép đối số cho được xác định theo một trong hai cách trong một phương pháp gọi:

• Đối số đưa ra cho một mảng tham số có thể là một biểu thức đơn của loại là chuyển đổi hoàn toàn (§13.1) thành loại mảng tham số . Trong trường hợp này, mảng tham số hoạt động chính xác như thông số giá trị.

• Ngoài ra, gọi có thể định không hay nhiều đối số cho mảng tham số, trong đó mỗi lập luận là một biểu hiện của một loại đó là ngầm mui trần (§13.1) để loại phần tử của mảng tham số. Trong trường hợp này, gọi tạo một thể hiện của kiểu mảng tham số với chiều dài tương ứng với số lượng đối số, khởi các yếu tố của dụ mảng với các giá trị tham số nhất định, và sử dụng các mảng mới được tạo dụ làm đối số thực tế.

Trong phần cùng một ví dụ được đưa ra:

using System; 
class Test 
{ 
    static void F(params int[] args) { 
     Console.Write("Array contains {0} elements:", args.Length); 
     foreach (int i in args) 
      Console.Write(" {0}", i); 
     Console.WriteLine(); 
    } 

    static void Main() { 
     int[] arr = {1, 2, 3}; 
     F(arr); 
     F(10, 20, 30, 40); 
     F(); 
    } 
} 

sản xuất sản lượng

Array contains 3 elements: 1 2 3 Array 
contains 4 elements: 10 20 30 40 Array 
contains 0 elements: 

Ví dụ này minh họa hành vi dự kiến: mảng trống

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