Có một chuyển đổi rõ ràng từ hai đến Int64, nhưng không phải từ lớp học của bạn để Int64. tất cả những gì bạn cần làm là xác định một. Hoặc, nếu bạn có một chuyển đổi từ lớp học của bạn để tăng gấp đôi, mà tôi cho rằng bạn làm, bạn có thể làm điều này:
long x = (long) (double) a;
Tuy nhiên, điều đó cồng kềnh; Tôi muốn xác định toán tử chuyển đổi rõ ràng.
Chuyển đổi phải rõ ràng, không ngầm, trừ khi bạn có lý do chính đáng để làm rõ.
Chuyển đổi được xác định bằng ngôn ngữ từ kép thành dài rõ ràng do chuyển đổi có thể gây mất thông tin. Bạn có thể mất thông tin với chuyển đổi này vì có một số đôi, như 0,5, không chuyển đổi chính xác thành dài. Đây được gọi là thu hẹp chuyển đổi.
Với chuyển đổi được xác định bằng ngôn ngữ, thu hẹp chuyển đổi rõ ràng. Nếu chúng được ngầm định, các lập trình viên có thể vô tình mất thông tin bằng cách gán một giá trị của một kiểu cho một biến kiểu khác. Xác định chuyển đổi này là ngầm định vi phạm nguyên tắc hoàn toàn hợp lý, vì vậy sẽ phải có một số trường hợp hấp dẫn để làm như vậy.
Dưới đây là ví dụ hiển thị giá trị của nguyên tắc này. Nếu thu hẹp chuyển đổi được ngầm định, nó sẽ làm cho mã dễ vỡ hơn. Giả sử rằng chuyển đổi kép thành nội dung ẩn:
class Family
{
ICollection<Person> Children { get; set; }
}
int GetAverageNumberOfChildren(IEnumerable<Family> families)
{
return families.Sum(f => f.Children.Count)/families.Count();
}
void SomeMethod(IEnumerable<Family> families)
{
int averageNumberOfChildren = GetAverageNumberOfChildren(families);
//...
}
Rất tiếc! Chúng tôi có một lỗi! GetAverageNumberOfChildren
sẽ trả về gấp đôi! Hãy sửa nó!
double GetAverageNumberOfChildren(IEnumerable<Family> families)
{
return families.Average(f => f.Children.Count);
}
Whew, mọi thứ biên dịch và chạy! Chắc chắn vui vì chúng tôi đã bắt được lỗi đó!
Nhưng thật đáng buồn là không. Chúng tôi vẫn có lỗi!SomeMethod
chuyển đổi hoàn toàn số double thành int, do đó, giá trị mong đợi có thể là 2.4
, giá trị thực tế là 2
.
Vì chuyển đổi hai thành một là rõ ràng, trình biên dịch lưu chúng ta khỏi chính chúng ta. Sau khi chúng tôi sửa lỗi GetAverageNumberOfChildren
, chương trình không đúng sẽ không biên dịch.
Bây giờ, nếu lớp học MyDouble
của bạn có một số xác thực đã hạn chế nó thành giá trị nguyên với phạm vi bằng hoặc nhỏ hơn phạm vi long
, thì bạn sẽ an toàn để chuyển đổi ẩn. Nhưng trong trường hợp đó, tất nhiên, bạn nên sử dụng long
, không phải double
.
Tại sao bạn sử dụng cả 'long' và' Int64'? Một là một aloas cho người khác và tôi nghĩ cách thành ngữ hơn là sử dụng các bí danh nếu chúng tồn tại thay vì các tên kiểu. – Joey