2011-02-23 72 views
11

我想改變default(T)對於某些類的行爲。因此,而不是爲我的引用類型返回null,我想返回一個空對象。像如何更改默認(T)在C#中返回的內容?

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

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

任何的

種類知道這是在所有可能的?

回答

2

我想你已經在你的問題中得到了答案:if/switch statement。事情是這樣的:

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

你可以使自己的擴展方法是這樣的:

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 
} 

用法:

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

我認爲,問題是:如何能有人從...的SingleOrDefault內做到這一點()!? – 2011-02-23 08:56:56

+1

@ralf:Em..I添加一個示例實現。看我的編輯。 – 2011-02-23 09:04:07

3

我不認爲,這是可能的。然而,你可以做的是創建你自己的擴展方法SingleOrCustomDefault或類似的東西。

+1

這絕對是最乾淨的方法。 – 2011-02-23 09:02:09

7

您不能更改默認值(T) - 對於引用類型,它始終爲空,值類型爲零。

3

如何:

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

+1爲簡單起見。 – Lucas 2012-07-04 14:33:53

+2

等價較短:'var kid = kids.SingleOrDefault(k => k.Age <10)??新的孩子();' – smdrager 2015-09-21 20:57:52

12

任何人都知道,如果這是在所有可能的 ?

根本不可能。

但也許你想使用DefaultIfEmpty代替:

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

if (kid == NullKid) 
{ 
    Console.Out.WriteLine("Jippeie"); 
} 
相關問題