Điều gì gây ra vấn đề này?
Đối với tôi, có vẻ như một lỗi trình biên dịch. Ít nhất, nó đã làm. Mặc dù các biểu thức decimal.TryParse(v, out a)
và decimal.TryParse(v, out b)
biểu thức được đánh giá động, tôi mong đợi trình biên dịch vẫn hiểu rằng vào thời điểm nó đạt đến a <= b
, cả hai a
và b
chắc chắn được gán. Ngay cả với những điều kỳ lạ mà bạn có thể gặp phải khi nhập động, tôi mong rằng sẽ chỉ đánh giá a <= b
sau khi đánh giá cả hai TryParse
cuộc gọi.
Tuy nhiên, nó chỉ ra rằng thông qua toán tử và chuyển đổi phức tạp, hoàn toàn khả thi để có một biểu thức A && B && C
đánh giá A
và C
nhưng không B
- nếu bạn đủ tinh ranh. Xem báo cáo lỗi Roslyn để biết ví dụ tài tình của Neal Gafter.
Thực hiện công việc đó dynamic
thậm chí còn khó hơn - ngữ nghĩa liên quan khi toán hạng động khó mô tả hơn, bởi vì để thực hiện giải quyết quá tải, bạn cần đánh giá các toán hạng để tìm ra loại nào có liên quan, điều này có thể phản trực quan. Tuy nhiên, một lần nữa Neal đã đưa ra một ví dụ cho thấy rằng lỗi trình biên dịch là bắt buộc ... đây không phải là một lỗi, đó là một bản sửa lỗi . Neal đã nhận được rất nhiều kudo để chứng minh điều đó.
Có thể sửa nó thông qua cài đặt trình biên dịch không?
Không, nhưng có những lựa chọn thay thế tránh được lỗi.
Thứ nhất, bạn có thể ngăn nó hoạt động - nếu bạn biết rằng bạn sẽ chỉ sử dụng chuỗi, thì bạn có thể sử dụng IEnumerable<string>
hoặc cung cấp cho biến phạm vi v
một loại string
(tức là from string v in array
). Đó sẽ là lựa chọn ưu tiên của tôi.
Nếu bạn thực sự cần giữ cho nó động, chỉ cần cung cấp b
một giá trị để bắt đầu bằng:
decimal a, b = 0m;
Điều này sẽ không gây hại gì - chúng tôi biết rằng thực sự đánh giá động của bạn sẽ không gây ra bất kỳ điều gì điên rồ, vì vậy cuối cùng bạn sẽ vẫn chỉ định một giá trị b
trước khi sử dụng nó, khiến giá trị ban đầu không liên quan.
Ngoài ra, có vẻ như việc thêm dấu ngoặc đơn cũng hoạt động:
where decimal.TryParse(v, out a) && (decimal.TryParse("15", out b) && a <= b)
Điều đó thay đổi thời điểm kích hoạt các phần giải quyết quá tải khác nhau và tình cờ làm cho trình biên dịch hài lòng.
Vẫn còn một vấn đề - các quy tắc của đặc tả về việc gán xác định với &&
toán tử cần được làm rõ để nêu rõ rằng chúng chỉ áp dụng khi &&
toán tử đang được sử dụng trong triển khai "thông thường" với hai bool
toán hạng. Tôi sẽ cố gắng đảm bảo điều này được khắc phục cho tiêu chuẩn ECMA tiếp theo.
b
sau khi gán nó qua mộtout
tham số.