2009-03-09 23 views
6

" 'iade' ifadesine dönüştürme" rutin aşağıdadır:Resharper Tuzak Verilen

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

Resharper üçlü operatör ile yapılan açıklamada içine refactor bana seçenek sunmaktadır:

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

Kim yapabilir tuzağı mı buldun?

+0

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

cevap

11

Tamam, önceki yanıtla değiştirin. Çünkü Int64 ile Double arasında örtük bir dönüşüm var (ancak tam tersi değil), bu ifadenin sonuç türü olacaktır. Yani, bir kutulu Int64 almayı beklediğinizde, aslında bir kutulu Double (ancak orijinal olarak Int64.Parse'dan gelen bir değerle) elde edersiniz.

Sadece yeterince açık olmaması durumunda, return ifadelerini, yalnızca bir değişken döndürecekleri şekilde değiştirelim. uygun

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

dönüştürme:

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; 
    } 
} 

Ve şimdi koşullu operatör ile sürümüne aynı yapalım:

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

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; 
} 
olur İşte orijinal kod

DÜZENLEME: Reque olarak Sted, biraz daha fazla bilgi. forma

X ? Y : Z 

bir koşullu ifade tip I TY ve TZ arayacağım Y ve Z türleri bağlıdır. Birkaç seçenek vardır:

  • TY ve TZ aynı tip şunlardır: Sonuç o türüdür
  • TY den TZ için değil TZ den TY bir örtük dönüştürme vardır: Sonuç tipi TZ ve taşımaktadır ilk dal kullanılıyorsa dönüşüm kullanılır.
  • TZ değil TY den TZ için TY açıklamakla beraber örtük dönüştürme vardır: Sonuç tipi TY sahiptir ve ikinci dalı kullanılırsa dönüşüm kullanılır.
  • her iki yönde bir örtük dönüştürme vardır: derleme zamanı hatası
  • hiç dönüşüm her iki şekilde vardır: Hata

bu yardım mı derleme zamanı?

+0

Bunu bana daha önce aldım ... – leppie

+0

CodeProject hakkında 6 ay önce gönderdim. Aslında, bir tamsayı, kesin bir hassasiyet olsa bile, dolaylı olarak bir çift olduğu korkusudur. – leppie

+0

İki kez örtük dönüşümün neden gerçekleştiğine dair bir iki cümle ekleyebilir misiniz?(Muhtemelen üçlü/koşullu operatörün bazı özellikleri) – Miles