Как изменить то, что по умолчанию (T) возвращается в С#?

Я хотел бы изменить способ поведения по умолчанию (T) для определенных классов. Поэтому вместо того, чтобы возвращать null для моих ссылочных типов, я хотел бы вернуть нулевой объект.

Вид как

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

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

Кто-нибудь знает, возможно ли это?

Ответ 1

Кто-нибудь знает, если это вообще возможно?

Это просто невозможно вообще.

Но, возможно, вы захотите вместо DefaultIfEmpty:

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

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

Ответ 2

Вы не можете изменить значение по умолчанию (T) - оно всегда равно null для ссылочных типов и ноль для типов значений.

Ответ 3

Не думаю, что это возможно. Однако вы могли бы создать свой собственный метод расширения SingleOrCustomDefault или что-то в этом роде.

Ответ 4

Как насчет этого:

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

Ответ 5

Думаю, у вас уже есть ответ в вашем вопросе: 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());