【问题标题】:How to change what default(T) returns in C#?如何更改 C# 中的 default(T) 返回值?
【发布时间】: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");
}

有人知道这是否可能吗?

【问题讨论】:

    标签: c# linq default nullable


    【解决方案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】:

      这个怎么样:

      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() 内部做到这一点!?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      相关资源
      最近更新 更多