Tôi đã mượn mã dưới đây từ another question (chút thay đổi), để sử dụng trong mã của tôi:Tại sao/khi nào điều quan trọng là phải chỉ định toán tử là rõ ràng?
internal class PositiveDouble
{
private double _value;
public PositiveDouble(double val)
{
if (val < 0)
throw new ArgumentOutOfRangeException("Value needs to be positive");
_value = val;
}
// This conversion is safe, we can make it implicit
public static implicit operator double(PositiveDouble d)
{
return d._value;
}
// This conversion is not always safe, so we're supposed to make it explicit
public static explicit operator PositiveDouble(double d)
{
return new PositiveDouble(d); // this constructor might throw exception
}
}
Tác giả ban đầu của mã này tuân thủ một cách chính xác để những lời cảnh báo được đưa ra trong tài liệu hướng dẫn implicit & explicit MSDN, nhưng đây là Câu hỏi của tôi: Có phải explicit
luôn cần thiết trong mã có khả năng đặc biệt?
Vì vậy, tôi đã có một số loại trong mã của tôi (ví dụ: "Khối lượng") có nguồn gốc từ PositiveDouble và tôi muốn để có thể thiết lập các trường hợp thuận tiện như dòng đầu tiên dưới đây:
Volume v = 10; //only allowed by implicit conversion
Volume v = new Volume(10) //required by explicit conversion, but gets messy quick
Buộc phải sử dụng các phôi rõ ràng ở khắp mọi nơi làm cho mã ít dễ đọc hơn. Nó bảo vệ người dùng như thế nào? Trong ngữ nghĩa của chương trình của tôi, tôi không bao giờ mong đợi một Khối lượng âm; thực sự, nếu nó bao giờ xảy ra tôi mong đợi một ngoại lệ được ném. Vì vậy, nếu tôi sử dụng một chuyển đổi tiềm ẩn và nó ném, những gì "kết quả bất ngờ" có thể clobber tôi?
Dường như tôi thay đổi toán tử chuyển đổi của bạn thành ngầm nên ở đây. – Botonomous
Được khuyến nghị, đặc biệt trong API công khai. Nó ngăn cản mọi người sử dụng diễn viên mà không nhận thấy nó có thể ném, tiết kiệm thời gian trong việc gỡ lỗi. Làm cho mọi người chú ý đến diễn viên sẽ tránh rắc rối. Họ nói "oh, vì vậy bạn nghĩ rằng bạn đang thông minh làm cho tất cả các diễn viên tiềm ẩn?" và bạn nói "Nếu bạn biết bạn đang làm gì, bạn sẽ không gặp vấn đề gì" - hãy tưởng tượng một cái bếp bắt đầu khi có thứ gì đó trên đó, bởi vì "Bị buộc phải khởi động bếp mỗi lần nấu ít hiệu quả hơn", và các nhà sản xuất đáp ứng với tuyên bố với "sau đó không đặt mọi thứ vào nó" - chỉ ít kịch tính và không có bỏng. – Theraot