Cây biểu thức có thể không chứa cuộc gọi hoặc lời gọi sử dụng các đối số tùy chọn


145

Cây biểu thức có thể không chứa cuộc gọi hoặc lời gọi sử dụng các đối số tùy chọn

return this.RedirectToAction<MerchantController>(x => x.Edit(merchantId));

Trường hợp chỉnh sửa có một đối số thứ hai, nullable.

Tại sao lại thế này?

Câu trả lời:


106

Các tiềm ẩn cây biểu thức API không hỗ trợ đối số tùy chọn.

Đối với mã được biên dịch IL, trình biên dịch C # sẽ chèn các giá trị mặc định tại thời gian biên dịch (mã hóa cứng), vì CLR không hỗ trợ các phương thức gọi với các đối số tùy chọn khi các đối số không được cung cấp rõ ràng.


2
Điều này bằng cách nào đó bao gồm quá tải? Tôi đã nhận được điều này khi tôi làm quá tải. Một cái gì đó như void Blah (chuỗi a) và void Blah (đối tượng a). Khi tôi cố gắng thực hiện một cuộc gọi đến phiên bản với đối tượng, nó đã báo lỗi cho tôi.
vbullinger

4
Quá tải được hỗ trợ đầy đủ theo nghĩa là một quá tải cụ thể sẽ được mã hóa cứng vào cây.
usr

1
Thông báo lỗi khá khó hiểu, nhưng câu trả lời này cho thấy cách thức, tôi có tham số tùy chọn với giá trị mặc định trên phương thức đang cố gắng giả định.
vpalmu

139

Có cùng một thông báo khi cố gắng sử dụng Mock.setup để giả định một phương thức có nhiều tham số mặc định. Tôi chỉ cần thêm các tham số bổ sung trong lambda.

void someMethod(string arg1 = "", string arg2 = "")

mockedObject.Setup(x => x.someMethod(It.IsAny<string>(), It.IsAny<string>()))

1
Điều này đã giúp tôi. Tôi đã bỏ lỡ It.IsAny<object>. Về cơ bản tôi đã thiếu một tham số chosomeMethod()
akasoggybunz 7/12/18

Tôi cũng phải đảm bảo rằng tôi đã bao gồm các giá trị cho mọi tham số trong phương thức (mặc dù một số tham số trong chữ ký phương thức có các giá trị mặc định được đặt).
slashNburn

1
Tùy thuộc vào trường hợp sử dụng cũng ... x.someMethod(default,default)... có thể được sử dụng.
LosManos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.