【问题标题】:Check for null for struct in C# if struct isn't nullable如果结构不可为空,则在 C# 中检查结构是否为空
【发布时间】:2011-10-25 19:27:10
【问题描述】:

我有一些通用方法

T SomeMethod(Func<T> func){
   T result = func();
     if (result != null)
       { //.....}
}

如果T 是类,则效果很好。但是如果T是struct我该怎么办?如果Tstruct,我如何检查result == default(T)

附:我不想使用约束 where T: classNullable 类型。

【问题讨论】:

  • 检查值类型是否等于默认值有什么用,这在逻辑上如何匹配null的对象?如果刚刚构造了一个引用类型怎么办 - 那是等价的吗?我认为这不能笼统地回答,但必须根据您的情况逐案回答。
  • 添加到@dlev default(T) where T : class == null
  • 扩展我之前的评论,如果你只是想避免 NRE,那么 JaredPar 的回答告诉你,你可以简单地写 if(result != null)

标签: c# .net c#-4.0


【解决方案1】:

一种更惯用的方法是遵循int.TryParse 之类的方法。

public delegate bool TryFunction<T>(out T result);

T SomeMethod(TryFunction<T> func)
{
    T value;

    if(func(out value))
    {

    }
}

【讨论】:

  • 这不遵循int.TryParse 的领导,而是建立在它之上。我不认为这是惯用的,但这不是一个坏主意。无论是一般性地解决原始问题还是只是解决问题,这都是一个不同的问题(我无法回答 - 检查我对 OP 的评论,因为我认为这个问题无法得到一般性的回答)。
  • Func&lt;out T, bool&gt; 不会编译。您必须为此创建新的委托类型。
  • @svick:很好的收获;我现在不在VS面前。尽管如此,这应该可以解决问题。
  • @MerlynMorgan-Graham:我很好奇它是如何不“跟随它的领导”的。常见的想法是将返回值移动到out 参数中,并返回一个bool 表示成功。我之所以称它为惯用的,是因为该技术在框架中的多个地方使用,并且似乎符合要求。
  • @Adam:投反对票的不是我。我只是迂腐,想要更清楚地了解哪些部分是惯用的。委托的签名是惯用的(try-method),但采用 try-method,无论是否通用,并将其用作谓词并不惯用。但这可能是个好主意。
【解决方案2】:

如果T 编译为struct,则与null 的比较将始终计算为false。这在 C# 语言规范的第 7.9.6 节中有所介绍

如果将类型参数类型T的操作数与null进行比较,而T的运行时类型为值类型,则比较结果为false。

【讨论】:

  • 有趣的是,当您将可空结构与null 进行比较时,它仍然返回null
  • 您使用了哪个版本的规范?我读到:“如果 B 是一个类型参数并且在运行时该类型参数是一个可为空的类型或引用类型,结果就好像 B 类型的操作数被装箱然后与 null 比较。” [ECMA 第 4 版]跨度>
  • @CodeInChaos 我正在阅读 C# 3.5 语言规范以供参考
  • @CodeInChaos:这是特定于Nullable&lt;T&gt;(它本身是一个结构)的行为,以及分配null 的能力。这已经融入语言(也许还有运行时;我不确定),并且不能在用户类型上复制。
  • @JaredPar,你的意思是 if (result != null || result==false) 吗?它适用于结构吗?
【解决方案3】:

考虑使用默认(T):

private T SomeMethod<T>(Func<T> func)
{
  var result = func();
  if (result.Equals(default(T)))
  {
    // handling ...
    return default(T);
  }
  return result;
}

【讨论】:

  • 如果T 是一个引用类型,这将抛出一个NullReferenceException
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 2014-04-13
相关资源
最近更新 更多