2009-03-09 38 views
6

Do sau thói quen:Resharper Trap "Convert to 'trở lại' tuyên bố"

private static object ParseNumber(string token, FieldDefinition def) 
{ 
    if (def.Fraction > 0) 
    return Double.Parse(token); 
    else 
    return Int64.Parse(token); 
} 

Resharper cung cấp cho tôi những tùy chọn để cấu trúc lại nó vào một tuyên bố với các nhà điều hành ternary:

private static object ParseNumber(string token, FieldDefinition def) 
{ 
    return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token); 
} 

Ai có thể phát hiện ra cái bẫy?

+0

http://cznp.com/s/7JM –

Trả lời

11

OK, đổi thành câu trả lời trước. Vì có chuyển đổi tiềm ẩn từ Int64 đến Double (nhưng không phải ngược lại), đó sẽ là loại kết quả của biểu thức. Vì vậy, khi bạn mong đợi để có được một đóng hộp Int64, bạn thực sự nhận được một đóng hộp Double (nhưng với một giá trị ban đầu đến từ Int64.Parse).

Chỉ trong trường hợp không đủ rõ ràng, hãy thay đổi tất cả câu lệnh return sao cho chúng chỉ trả về một biến. Dưới đây là mã gốc:

private static object ParseNumber(string token, FieldDefinition def) 
{ 
    if (def.Fraction > 0) 
    return Double.Parse(token); 
    else 
    return Int64.Parse(token); 
} 

Chuyển đổi đó một cách thích hợp:

private static object ParseNumber(string token, FieldDefinition def) 
{ 
    if (def.Fraction > 0) 
    { 
    double d = Double.Parse(token); 
    object boxed = d; // Result is a boxed Double 
    return boxed; 
    } 
    else 
    { 
    long l = Int64.Parse(token); 
    object boxed = l; // Result is a boxed Int64 
    return boxed; 
    } 
} 

Và bây giờ chúng ta hãy làm điều tương tự với phiên bản với các nhà điều hành có điều kiện:

private static object ParseNumber(string token, FieldDefinition def) 
{ 
    return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token); 
} 

trở thành

private static object ParseNumber(string token, FieldDefinition def) 
{ 
    // The Int64.Parse branch will implicitly convert to Double 
    double d = def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token); 
    object boxed = d; // *Always* a Double 
    return boxed; 
} 

EDIT: Như reque sted, một chút thông tin. Các loại của một biểu thức điều kiện của mẫu

X ? Y : Z 

phụ thuộc vào loại YZ, mà tôi sẽ gọi TYTZ. Có một vài lựa chọn:

  • TYTZ là cùng loại: kết quả là kiểu đó
  • Có một chuyển đổi ngầm từ TY để TZ nhưng không phải từ TZ để TY: kết quả là loại TZ và chuyển đổi được sử dụng nếu chi nhánh đầu tiên được sử dụng.
  • Có chuyển đổi tiềm ẩn từ TZ đến TY nhưng không phải từ TY đến TZ: kết quả là loại TY và chuyển đổi được sử dụng nếu chi nhánh thứ hai được sử dụng.
  • Có một chuyển đổi ngầm ở cả hai hướng: thời gian biên dịch lỗi
  • Không có chuyển đổi trong hai cách: thời gian biên dịch lỗi

Điều đó giúp đỡ?

+0

Điều này đã cho tôi trước ... – leppie

+0

Tôi đã đăng khoảng 6 tháng trước về CodeProject. Trong thực tế, nó là đáng sợ rằng một số nguyên là ngầm một đôi, mặc dù nó lỏng lẻo chính xác. – leppie

+0

Bạn có thể thêm một hoặc hai câu về lý do khiến chuyển đổi tiềm ẩn thành hai lần xuất hiện không?(có lẽ là một số tài sản của nhà điều hành bậc ba/có điều kiện) – Miles