2015-05-22 11 views
5

ile geçerli değil Geçerli değeri kontrol eden bu işleve sahibim. Geçerli değer (1 parametresi) null veya boş olduğunda, o zaman kod yukarıda kısmen düzgün çalışıyor ... Ama geçilmesinin varsayılan değer (2 menü noktası)Belirtilen satır genel

public static T ZeroNull<T>(object currentValue, T defaultValue) 
{ 
    if (currentValue.Equals(DBNull.Value)) 
     return (T)defaultValue; 
    else if (currentValue.Equals(string.Empty)) 
     return (T)defaultValue; 
    else 
     return (T)currentValue; 
} 

kullanır Ben kodu gibi kullandığınızda Bu, bu

float currValue = 20.1f; 
int i = ZeroNull<int>(currValue, 0); // Specified cast is not valid 

int i = ZeroNull<int>("10", 0); // Specified cast is not valid 

Herkes yukarıdaki kod snip artırabilir " ... Belirtilen atama geçerli değil" bir atar? Ve derleyici neden bu hatayı atıyor?

Selamlar, Jessie

karşılaştığınız mesele sizden T Tipi int olduğunda T'ye currValue döküm yoluyla yapmaya çalıştığımız şey olan int Dize döküm olamaz olmasıdır
+0

sorun 'currValue' bir kutulu şamandıra (20.1f) 'dir ve sizin geçerli olmayan bir int için Unbox çalışıyor olmasıdır: jenerik Bu deneyin olmadan, aynı zamanda bir InvalidCastException atacağım yeniden oluşturmak için. Aynı şey "10" – chomba

+0

için de geçerlidir. Chomba'ya teşekkürler, ancak bunu yaptığımda neden bir hata atmıyor. 'code'float currValue = 10.2f; 'code'int newCurrValue = (int) currValue; Sadece aynı mantığa sahip olduklarını farz ediyorum? – klaydze

+0

Bunun nedeni, yalnızca türler arasında açık bir şekilde yayın yapmaktır. Bununla birlikte, bir değer türünde bir kutu oluşturduğunuzda, önce alttaki türdeki kutudan çıkarmanız gerekir. – chomba

cevap

4

IConvertible Arabirimini kullanarak deneyebilirsiniz, bu nedenle en azından bunu uygulayan türler için çalışır. Bu hala kullanımını yapmazlar türleri için istisnalar atabilir Dikkat, ancak dönüşümler için gayet yapıyor:

public static T ZeroNull<T>(object currentValue, T defaultValue) 
{ 
    if (currentValue.Equals(DBNull.Value)) 
     return (T)defaultValue; 
    else if (currentValue.Equals(string.Empty)) 
     return (T)defaultValue; 
    else 
     return (T)Convert.ChangeType(currentValue,typeof(T)); 
} 

şamandıra gelen int Oyunculara dikkate alınarak: Bir kutulu türüne dönüştürmek için çalışıyoruz - Yöntemi, bir nesneyi etkili bir şekilde dönüştürdüğünüz zaman kutulanmıştı. Kutulu tipler sadece kendilerine geri gönderilebilir. Int için bir cast aynı türde olmadığından, çalışmaz.

float currValue = 20.1f; 

object yourValue = currValue; 
int i = (int) yourValue; //throws as well 
+0

Öneriniz için teşekkürler. Bunu denedim ve şu anki gereksinim için iyi çalışıyor. Yine başka bir istisna ile karşılaştığım zamana kadar öneriye bağlı kalacağım. :) – klaydze

0

.

Böyle bir işlemi gerçekleştirmek için, Convert.ToInt32 veya Int.Parse'ı kullanmanız gerekir. her ikisi de mevcut tasarımınızı zayıflatacak.

İlgili konular