2008-12-08 35 views
36

Có thể ghi đè toán tử kết hợp null cho một lớp trong C# không?Có thể ghi đè toán tử hợp nhất không?

Ví dụ: tôi muốn trả lại giá trị mặc định nếu một thể hiện là rỗng và trả về cá thể nếu không. Mã sẽ trông giống như sau:

return instance ?? new MyClass("Default"); 

Nhưng nếu tôi muốn sử dụng toán tử kết hợp null để kiểm tra xem MyClass.MyValue có được đặt không?

Tất nhiên không có nhu cầu thực sự cho điều này (vì vậy trước khi bạn trả lời "tại sao bạn muốn làm điều đó" - Tôi chỉ tò mò nếu có thể.

+0

Patrik, một sử dụng: Tôi muốn quá tải toán tử null-coalescing chuỗi để xem xét rỗng như null. Cho dù đó là hợp lý hay bất cứ điều gì, đó là một câu hỏi khác nhau. – ANeves

Trả lời

29

Câu hỏi hay! Nó không được liệt kê theo cách này hay cách khác trong số list of overloadable and non-overloadable operators và không có gì được đề cập trên the operator's page.

Vì vậy, tôi thử như sau:

public class TestClass 
{ 
    public static TestClass operator ??(TestClass test1, TestClass test2) 
    { 
     return test1; 
    } 
} 

và tôi nhận được lỗi "Overloadable điều hành nhị phân mong đợi". Vì vậy, tôi muốn nói câu trả lời là, như của .NET 3.5, một không.

6

Câu trả lời đơn giản: Không

C# nguyên tắc thiết kế không cho phép quá tải nhà điều hành thay đổi ngữ nghĩa của ngôn ngữ. Do đó các toán tử phức tạp như phép gán phức hợp, toán tử bậc ba và ... không thể bị quá tải.

14

Theo tiêu chuẩn ECMA-334, không thể quá tải ?? nhà điều hành.

Tương tự như vậy, bạn không thể quá tải các toán tử sau:

  • =
  • & &
  • ||
  • :
  • kiểm tra
  • kiểm soát
  • mới
  • typeof
  • như
-2

Nếu bất cứ ai đang ở đây tìm kiếm một giải pháp, ví dụ gần nhất sẽ được làm điều này

return instance.MyValue != null ? instance : new MyClass("Default"); 
+2

-1: bạn đang thiếu điểm, bạn đã có thể làm những gì bạn đề xuất với mã OP ... cũng xin vui lòng đọc kỹ câu hỏi, anh ấy không hỏi làm thế nào để làm điều đó nhưng nếu có thể quá tải toán tử null-coalescing - Thật không may là không. – ANeves

+0

Tôi hiểu anh ấy đã hỏi về việc quá tải? nhà điều hành và tôi đọc câu trả lời nói rằng điều đó là không thể. Vì vậy, tôi đã chỉ cung cấp một giải pháp mà không làm việc với kết quả mong đợi (cấp nó không sử dụng toán tử ??) cho bất cứ ai có thể đi qua trang này tìm kiếm một cái gì đó hoạt động. – soniiic

+1

+1: bởi vì nó có liên quan VÀ nó rõ ràng nói rằng nó không phải là một câu trả lời thực sự nhưng một ví dụ gần – Jaap

2

Điều này được đồn đại là một phần của phiên bản tiếp theo của C#. Từ http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated

7. monadic kiểm tra null

Loại bỏ sự cần thiết phải kiểm tra null trước khi truy cập các thuộc tính hoặc các phương pháp. Được gọi là Toán tử điều hướng an toàn trong Groovy).

Trước

if (points != null) { 
    var next = points.FirstOrDefault(); 
    if (next != null && next.X != null) return next.X; 
} 
return -1; 

Sau

var bestValue = points?.FirstOrDefault()?.X ?? -1; 
Các vấn đề liên quan