How to change what default(T) returns in C#?
I would like to change how default(T) behaves for certain classes. So instead of returning null for my reference types I would like to return a null object.
Kind of like
kids.Clear();
var kid = kids.Where(k => k.Age < 10).SingleOr开发者_如何学PythonDefault();
if (kid is NullKid)
{
Console.Out.WriteLine("Jippeie");
}
Anyone know if this is at all possible?
Anyone know if this is at all possible?
It is simply not possible at all.
But maybe you want to use DefaultIfEmpty instead:
kids.Clear();
var kid = kids.Where(k => k.Age < 10).DefaultIfEmpty(NullKid).Single();
if (kid == NullKid)
{
Console.Out.WriteLine("Jippeie");
}
You can't change default(T) - it's always null for reference types and zero for value types.
How about this:
var kid = kids.Where(k => k.Age < 10).SingleOrDefault() ?? new Kid();
I don't think, it is possible. What you could do however, is to create your own extension method SingleOrCustomDefault
or something like that.
I think you've already got the answer in your question: if/switch statement. Something like this:
if (T is Dog) return new Dog();
//instead of return default(T) which is null when Dog is a class
You can make your own extension method like this:
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
}
Usage:
var p = allProducts.SingleOrSpeficied(p => p.Name = "foo", new Product());
精彩评论