开发者

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());
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜