【问题标题】:Cast bool to T where T is int将 bool 转换为 T 其中 T 是 int
【发布时间】:2010-11-27 15:38:04
【问题描述】:

如何使此函数可靠地将 sourceValue 转换为类型 T,其中 sourceValue 为 bool 且 T 为 int?

公共静态 T ConvertTo(对象源值) { // 如果是相同类型 --> 立即返回 如果(源值是 T) 返回 (T) 源值; var val = ConvertTo(sourceValue, typeof (T)); 返回 (T) 值; }

目前,当尝试将 false 转换为 0 并将 true 转换为 1 时,这会引发 InvalidCastException。类型未预定义,这就是此处必须使用泛型的原因。但是,唯一失败的情况是 T:Int32 和 sourceValue:Boolean。

【问题讨论】:

  • 只是好奇,但是为什么要为此使用独立的方法呢?如果bbool,则执行int x = b ? 1 : 0;
  • 我认为他正在寻找通用解决方案,但这种“边缘”案例不适合。
  • 可能。我只是看不到通用转换方法的用例。我并不是说没有有效的,我只是暂时想不到。
  • 您的代码甚至无法编译。您的 ConvertTo 方法是否有第二次重载但您尚未发布?
  • 如果“bar”是值类型,则不能使用foo is baris 仅适用于引用类型

标签: c#-3.0 int casting boolean


【解决方案1】:

是假=0,真=1吗?也许在其他语言中,但这里的演员表没有意义。如果你真的需要这个,我认为这是一个特例。

【讨论】:

  • +1 如果类型是预定义的,这似乎不警告泛型。
  • Convert.ToInt32 正是这样做的——将 false 转换为 0,将 true 转换为 1。我想这确实有意义。
  • 类型不是预定义的,所以这里必须使用泛型。但是,唯一失败的情况是 T:Int32 和 sourceValue:Boolean。
【解决方案2】:

我认为将 bool 转换为 int 是未定义的。但是,我认为在您的函数中明确写出该特殊情况也不合适,否则您的函数与 .NET 隐式处理 int 和 bool 的方式不一致。

你最好写:

int value = someFlag ? 1 : 0;

【讨论】:

    【解决方案3】:

    不完全确定您要做什么,但 .net 确实支持将 bool 转换为 int

    Convert.ToInt32(true);
    

    它也可以使用object,并判断它是否是bool
    另见:Convert.ToInt32(bool), Convert.ToInt32(Object)

    【讨论】:

      【解决方案4】:

      我需要一个高度通用的解决方案。这是我能想到的最好的:

      公共静态 T ConvertTo(对象源值) { // 如果是相同类型 --> 立即返回 如果(源值是 T) 返回 (T) 源值; var val = ConvertTo(sourceValue, typeof (T)); // 特殊情况:将 bool(sourceValue) 转换为 int(T) 如果(val 是布尔值) { var b = (bool) val; 如果 (b) 返回(T)(对象)1; // 如果 val 为真,则返回 1 返回(T)(对象)0; } 返回 (T) 值; }

      【讨论】:

      • @Mark:这不会编译,与您问题中的原始示例相同。这两个示例都调用了您没有向我们展示的 ConvertTo 方法的另一个重载。如果您提供我们可以实际编译和测试的代码,那么我相信有人能够提供帮助。
      • 有人可以为卢克给出的理由投反对票吗?我没有足够的代表。
      • 因为卢克给出的原因。它无法编译,因此不是有效答案。如果有人像你一开始那样提出确切的问题,这将不是一个有效的答案。
      【解决方案5】:

      作为马克自己的回答的后续行动。我认为这是一个不错的解决方案:

              protected Nullable<T> ConvertTo<T>(Object sourceValue) where T : struct, IComparable
          {
              if (sourceValue is T)
                  return (T)sourceValue;
      
              if (sourceValue == null)
              {
                  return null;
              }
              try
              {
                  var val = Convert.ChangeType(sourceValue, typeof(T));
                  return (T)val;
              }
              catch (FormatException)
              {
                  return null;
              }
      
          }
      

      【讨论】:

      • 我不再需要解决这个问题,但是如果有人能验证这段代码是否可以编译,我会将此标记为答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 2011-10-31
      • 1970-01-01
      相关资源
      最近更新 更多