我想改變default(T)對於某些類的行爲。因此,而不是爲我的引用類型返回null,我想返回一個空對象。像如何更改默認(T)在C#中返回的內容?
kids.Clear();
var kid = kids.Where(k => k.Age < 10).SingleOrDefault();
if (kid is NullKid)
{
Console.Out.WriteLine("Jippeie");
}
任何的
種類知道這是在所有可能的?
我想改變default(T)對於某些類的行爲。因此,而不是爲我的引用類型返回null,我想返回一個空對象。像如何更改默認(T)在C#中返回的內容?
kids.Clear();
var kid = kids.Where(k => k.Age < 10).SingleOrDefault();
if (kid is NullKid)
{
Console.Out.WriteLine("Jippeie");
}
任何的
種類知道這是在所有可能的?
我想你已經在你的問題中得到了答案: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());
我不認爲,這是可能的。然而,你可以做的是創建你自己的擴展方法SingleOrCustomDefault
或類似的東西。
這絕對是最乾淨的方法。 – 2011-02-23 09:02:09
您不能更改默認值(T) - 對於引用類型,它始終爲空,值類型爲零。
任何人都知道,如果這是在所有可能的 ?
根本不可能。
但也許你想使用DefaultIfEmpty代替:
kids.Clear();
var kid = kids.Where(k => k.Age < 10).DefaultIfEmpty(NullKid).Single();
if (kid == NullKid)
{
Console.Out.WriteLine("Jippeie");
}
我認爲,問題是:如何能有人從...的SingleOrDefault內做到這一點()!? – 2011-02-23 08:56:56
@ralf:Em..I添加一個示例實現。看我的編輯。 – 2011-02-23 09:04:07