2011-02-23 14 views
11

Varsayılan (T) belirli sınıflar için nasıl davranacağını değiştirmek istiyorum. Bu nedenle, referans türleri için null döndürmek yerine, boş bir nesne döndürmek istiyorum. bu hiç mümkün olup olmadığını C# hangi varsayılan (T) döndürür nasıl değiştirilir?

kids.Clear(); 
var kid = kids.Where(k => k.Age < 10).SingleOrDefault(); 

if (kid is NullKid) 
{ 
    Console.Out.WriteLine("Jippeie"); 
} 

gibi Herkes

Tür biliyor?

cevap

2

Sorunuzda cevabı zaten aldığınızı düşünüyorum: if/switch cümlesi. Böyle bir şey:

if (T is Dog) return new Dog(); 
    //instead of return default(T) which is null when Dog is a class 

Kendi uzatma yöntemi şöyle yapabilirsiniz:

public static T SingleOrSpecified<T>(this IEnumerable<T> source, Func<T,bool> predicate, T specified) 
{ 
    //check parameters 
    var result = source.Where(predicate); 
    if (result.Count() == 0) return specified; 
    return result.Single(); //will throw exception if more than 1 item 
} 

Kullanımı:

sanmıyorum
var p = allProducts.SingleOrSpeficied(p => p.Name = "foo", new Product()); 
+0

sanırım, soru kalır: nasıl birisi arasında ... SingleOrDefault içinden yapabilirsiniz()!? –

+1

@ralf: Em..I örnek bir uygulama ekleyin. Düzenlememe bak. –

3

, bu mümkün. Ancak, yapabileceğiniz şey kendi uzantı yönteminizi SingleOrCustomDefault veya bunun gibi bir şey yaratmaktır.

+1

Bu kesinlikle en temiz yaklaşım. Sadelik için –

7

Varsayılan değeri (T) değiştiremezsiniz - referans türleri ve değer türleri için sıfırdır.

3

nasıl bu konuda: bu her mümkünse eğer

var kid = kids.Where(k => k.Age < 10).SingleOrDefault() ?? new Kid(); 
+1

+1. – Lucas

+2

Daha kısa eşdeğer: 'var kid = kids.SingleOrDefault (k => k.Age <10) ?? yeni Çocuk(); ' – smdrager

12

bilen var mı?

Bu kesinlikle mümkün değildir.

Ama belki bunun yerine DefaultIfEmpty kullanmak istiyorum:

kids.Clear(); 
var kid = kids.Where(k => k.Age < 10).DefaultIfEmpty(NullKid).Single(); 

if (kid == NullKid) 
{ 
    Console.Out.WriteLine("Jippeie"); 
}