【问题标题】:Checking a bool value with a generic in C# [duplicate]在 C# 中使用泛型检查布尔值 [重复]
【发布时间】:2017-09-04 04:07:07
【问题描述】:

我有以下方法:

void Test<T>(T Result)

我需要实现这样的东西:

if Result is null, or T is a bool and that bool is false

我试图做类似的事情

if (typeof(T) == typeof(bool)
{
  if ((bool)Result == false)   // doesn't work
  if (Result as bool == false) // doesn't work

如何在不创建两个方法的情况下实现这一点?

【问题讨论】:

  • 您所要求的称为模板专业化。 C# 中与此最接近的等价物是重载,请参阅我提出的重复答案。
  • 为您的方法Test&lt;T&gt;(T Result) where T : IComparable添加一个约束使其可比较Result.CompareTo(true)==0
  • if (someBool == false) 无论如何都没有用。只需使用if(!someBool)
  • @oerkelens 我想你的意思是if(!someBool) 不是更易读。
  • @L.B 当然!

标签: c#


【解决方案1】:

您可以尝试将其转换为可为空的 bool 并对其进行测试:

public void Test<T>(T result)
{
    var asBool = result as bool?;
    if (!asBool.HasValue || !asBool.Value)
    {
        // do whatever
    }
}

(我把Result改成了result,因为它是一个参数)

【讨论】:

  • 这行得通!谢谢!
【解决方案2】:

这是另一种解决方案,通过objectT 转换为bool(您不能直接将T 转换为bool):

if ((bool)(object)result == false)
{
    // bool with value set to false
}

如果性能是一个问题,您可能还需要考虑对答案中提出的所有解决方案进行基准测试 - 请参阅"Performance surprise with “as” and nullable types"

【讨论】:

  • 性能在这里不是问题,但感谢您的链接,这很有趣!
【解决方案3】:

你可以测试

if (EqualityComparer<T>.Default.Equals(result, default(T))) {
    ...
}

对于booldefault(T)false,对于引用类型它是null。对于所有其他类型,它是由设置为0 的所有位表示的值。 IE。对于数字类型,它将是 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多