How to change what default(T) returns in C#?

倾然丶 夕夏残阳落幕 提交于 2019-11-27 14:43:49

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());
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!