2012-06-08 17 views
7

Ben defaultValueiçin varsayılan değeri istiyorum ki,Oyun dizisi. C# cinsinden (genel) T?

internal static T GetIniSetting<T>(string config, string key, T defVal = default(T)) 

Ben dizeleri özel olmasını istiyorum imzasıyla, eski .INI yapılandırma tipi dosyasından kesinlikle yazılı değer döndüren bir yardımcı yöntemine sahip kodlayıcının bir varsayılan değer belirtmediği durumda, default(string) (null) değil, string.Empty olmalıdır.

if (cantFindValueInIniFile == true) 
{ 
    if ((typeof(T) == typeof(string)) && (defaultValue == null)) 
    { 
     // *** Code needed here - Cannot convert string to <T>*** 
     return (T)string.Empty; 
    } 
    return defaultValue; 
} 

Ben boşuna, sert döküm çalıştı ve as kelime ettik.

+0

bu özel durumda ... –

cevap

11

'hacky' yol:

return (T)(object)string.Empty; 

Notlar:

  • Eğer ön koşulları kontrol etmelerini olarak oldukça güvenlidir.
  • Referans türlerinde performans cezası fark edilmeyebilir.
+0

Teşekkür @Leppie + smartcaveman için çok uydurma görünmüyordu LSP yetkilerini çağırma: Yani varsayılan dize değeri olarak String.Empty kullanmak gibi arama yapmak! – StuartLC

5

Bunu şu şekilde yapmanız gerekir: (T)(object)(string.Empty).

Ayrıca küçük optimizasyonu yayınları ancak (yöntem çağrısı yerine başına) jenerik parametre için bir kez

+0

* Çok * küçük optimizasyon ... "oldukça darn hızlı" dir. –

+1

@pst, true, (referans türleriyle, en azından) ama neden olmasın? – smartcaveman

+0

Diğer şeyler üzerinde çalışmak için :) –

0

Ben ise yapmak zorunda kalmamak için statik salt okunur dize alanına bu saklamaktır Hatalı değilse, GetIniSetting'deki son parametre isteğe bağlıdır ve varsayılan olarak (dize) yalnızca bunun için bir şey sağlamazsanız alırsınız.

string value = GetIniSetting<string>(config, key, string.Empty); 
+2

Hatalısınız. Bir dize bir referans türüdür, böylece 'null' – smartcaveman

+0

(Ve 'varsayılan (dize)' 'null' olarak değerlendirir) iletebilirsiniz –