如何更改 C# 中的 default(T) 返回值?

Posted

技术标签:

【中文标题】如何更改 C# 中的 default(T) 返回值?【英文标题】:How to change what default(T) returns in C#? 【发布时间】:2011-02-23 08:48:08 【问题描述】:

我想更改某些类的 default(T) 行为方式。因此,我不想为我的引用类型返回 null,而是想返回一个 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,而对于值类型,它始终为零。

【讨论】:

这个答案在细节上并不完全正确,因为 bool 的默认值不是零而是假(仅命名一种默认值不为零的值类型;请参阅this article for a list。规范参考是Default value expressions in the C# language specification。【参考方案3】:

这个怎么样:

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

【讨论】:

较短的等价物:var kid = kids.SingleOrDefault(k =&gt; k.Age &lt; 10) ?? new Kid();【参考方案4】:

我不认为,这是可能的。但是,您可以做的是创建自己的扩展方法 SingleOrCustomDefault 或类似的东西。

【讨论】:

这绝对是最干净的方法。【参考方案5】:

我想你已经在你的问题中得到了答案:if/switch 语句。像这样的:

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

【讨论】:

我认为,问题仍然存在:有人怎么能从 ...SingleOrDefault() 内部做到这一点!?

以上是关于如何更改 C# 中的 default(T) 返回值?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 中的同一方法返回字符串以及 IEnumerable<T>? [复制]

编写高质量代码改善C#程序的157个建议——建议35:使用default为泛型类型变量指定初始值

未知模板类型的默认值或零值

C# 的默认值(T)的 VB 等效项

C#对泛型实例化对像的方法

如何根据不同df中提供的索引值对数据框中的特定列进行求和。返回总和和布尔 T/F