2013-07-18 27 views
8

Tương tự như this, nhưng với một twist.Các tham số VB tùy chọn được yêu cầu trong C#

VB khai báo hàm:

Public Shared Function MyFunc(ByVal Name As String, ByVal Num As Integer, Optional ByRef obj As Object = Nothing, Optional ByVal val As Integer = 0) As Boolean 

Khi gọi trong C# (giải pháp khác nhau, tôi sao chép trên các .dll)

Lỗi 164 Không quá tải cho phương pháp 'MyFunc' mất 2 đối số

Siêu dữ liệu hiển thị chức năng là:

public static bool MyFunc(string Name, int Num, ref object obj, int val = 0); 

Tại sao một người trong số này thực hiện khi người khác không?

Trả lời

9

C# không hỗ trợ các tham số tùy chọn ref. Nếu bạn thay đổi obj thành thông số ByValue, nó sẽ ổn.

Nếu bạn cố gắng tuyên bố một tùy chọn ref tham số trong C#, bạn sẽ vi phạm phần 10.6.1 của C# 4 spec:

Một cố định tham số với một mặc định đối số được gọi là thông số tùy chọn.

...

Một tham số ref hoặc out không thể có một mặc định đối số.

Ngoại lệ cho điều này là đối với COM, trong đó thông số ref rất phổ biến. Khi trình biên dịch C# biết nó đang xử lý một thành phần COM, nó sẽ cho phép bạn bỏ qua các tham số ref tùy chọn.

+0

Ra khỏi tò mò, tôi trao đổi thứ tự của hai tham số cuối cùng, C# dự án không có một vấn đề chấp nhận rằng, mặc dù siêu dữ liệu là 'public static bool MyFunc (tên chuỗi, int Num, int val = 0, đối tượng ref obj); 'là bất hợp pháp. Khi cố gắng truyền 2 tham số, tôi nhận được 'No overload ... nhận 2 tham số'. Khi cố gắng truyền 3 tham số, tôi nhận được 'No overload ... nhận 3 tham số'. Hấp dẫn. – JNF

+0

@JNF: Siêu dữ liệu bạn đang hiển thị chỉ là biểu diễn C# * * của bất kỳ nội dung nào trong IL. Tôi nghi ngờ siêu dữ liệu thực sự cho phiên bản gốc cũng tốt - nó chỉ là bất cứ điều gì bạn đang sử dụng để dịch siêu dữ liệu đó vào C# không làm việc phải làm gì. Tôi sẽ không chỉ thay đổi thứ tự của các tham số mặc dù - nếu điều đó xảy ra để làm việc bây giờ, nó không đảm bảo rằng nó sẽ trong tương lai. Tôi muốn thay đổi chữ ký thành một cái gì đó mà cũng là đại diện trong C#. –

+0

không, tốt, đó chỉ là tôi chơi Curious George. Tôi đã kết thúc quá tải trong VB. – JNF

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