2009-06-24 56 views
49

Tôi biết bạn có thể quá tải một toán tử hiện có. Tôi muốn biết nếu nó có thể tạo ra một nhà điều hành mới. Đây là kịch bản của tôi.Có thể tạo toán tử mới trong C# không?

Tôi muốn điều này:

var x = (y < z) ? y : z; 

Để được tương đương với điều này:

var x = y <? z; 

Nói cách khác, tôi muốn tạo <? điều hành của riêng tôi.

+0

không có ngôn ngữ nào có khả năng này ... – AminM

+7

@JesonPark - Không đúng. F # có nó như những người khác đã chỉ ra, và [C + + có nó là tốt.] (Http: // stackoverflow.com/questions/1515399/can-you-make-custom-operator-in-c) [CoffeeScript] (http://coffeescript.org/) cung cấp một số toán tử mới làm đường cú pháp cho các thành ngữ JavaScript và bạn có thể tùy chỉnh có thể mô tả nó như cho phép các toán tử tùy chỉnh. Người cuối cùng là một chút khéo léo, vì bạn về mặt kỹ thuật sẽ mở rộng ngôn ngữ. –

+0

@JustinMorgan: như đã đề cập trong bài viết CodeProject _ "C++ hỗ trợ quá tải toán tử, nhưng bạn không được phép tạo toán tử của riêng bạn" _ đây là mô phỏng !! – AminM

Trả lời

33

Không, không thể thực hiện được. Bạn cần tạo phương thức thay vì

27

Không, nhưng bạn có thể quá tải some existing operators trong C#.

Trong một số ngôn ngữ khác, như F #, bạn có thể sử dụng:

let (<?) = min 
+4

Thực ra, điều này sẽ là tối thiểu , không phải tối đa;) –

17

Như câu trả lời khác đã nói, bạn không thể tạo ra một nhà điều hành mới - ít nhất, không phải không có thay đổi lexer và phân tích cú pháp mà được tích hợp vào trình biên dịch. Về cơ bản, trình biên dịch được xây dựng để nhận ra rằng một ký tự riêng lẻ như < hoặc ? hoặc một cặp như >> hoặc <=, là một toán tử và để xử lý nó một cách đặc biệt; nó biết rằng i<5 là một biểu thức chứ không phải là một tên biến, ví dụ. Việc nhận biết toán tử là toán tử là một quá trình riêng biệt khi quyết định toán tử thực sự làm gì, và được tích hợp chặt chẽ hơn vào trình biên dịch - đó là lý do tại sao bạn có thể tùy chỉnh sau này chứ không phải tùy chọn cũ.

Đối với các ngôn ngữ có trình biên dịch mã nguồn mở (như GCC), bạn có thể, về mặt lý thuyết, sửa đổi trình biên dịch để nhận dạng toán tử mới. Nhưng nó sẽ không được đặc biệt dễ dàng, và bên cạnh đó, tất cả mọi người sẽ cần trình biên dịch tùy chỉnh của bạn để sử dụng mã của bạn.

+0

Chỉ vì lợi ích của sự rõ ràng, trong C++ người sử dụng macro để làm những việc như thế này? Tôi không biết C++, chỉ cần hỏi. –

+0

hoặc chỉ sử dụng các ngôn ngữ mà các toán tử là các phương thức infix, như scala hoặc f # –

5

Không chỉ bạn không thể làm điều đó, nhưng tại sao bạn muốn?

Tôi không chắc chắn những gì gõ y và z của bạn, nhưng nếu họ là một loại giá trị số, bạn có thể có thể sử dụng:

var x = Math.Min(y, z); 

Mặc dù cá nhân, tôi vẫn muốn:

var x = (y < z) ? y : z; 

Nhưng tôi là một chút? : junky.

Mã tốt không chỉ chặt chẽ và hiệu quả mà còn có thể đọc được. Ngay cả khi bạn là người duy nhất từng đọc nó, bạn sẽ trở lại với nhà điều hành <? đó một ngày và tự hỏi điều gì đã xảy ra.

+2

Không nếu đó là một tính năng đã biết bằng ngôn ngữ khác như câu hỏi này yêu cầu: http://stackoverflow.com/questions/523403/can-i-define-a- perl-like-binding-operator-in-c –

+0

Có thể nói tương tự đối với bất kỳ thao tác quá tải nào – JNF

+5

Tôi không đồng ý. Tôi nghĩ rằng quá tải nhà điều hành có ý nghĩa trong nhiều trường hợp. Ví dụ, nếu thêm hai trường hợp của một loại với nhau có ý nghĩa, bạn có thể muốn quá tải toán tử + thay vì tạo một phương thức .Add(). Trực giác, ai đó nhìn thấy "+" và họ hiểu toán tử là số học cộng hai thứ lại với nhau. Nếu đó là những gì quá tải có hiệu quả, thì nó dễ hiểu. –

2

Không, nhưng bạn có thể tạo Mở rộng phương pháp thay vì điều này

y.MethodName(z) 
+14

2.GetMin (1) là lạ – Dario

+5

2.IfNotSmallEnoughThen (1) :) –

+0

Tôi có true.Xor (false) ở đây ... :( – SparK

-3

bạn có thể cố gắng quá tải toán tử khác như % hoặc + để hoạt động như một nhà điều hành <?.

Sẽ vui vẻ

+1

Đây không phải là câu trả lời cho câu hỏi của anh ấy. –

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