将bool转换为T,其中T为int

时间:2009-09-11 21:14:27

标签: c#-3.0 int casting boolean

如何让这个函数可靠地将sourceValue转换为类型T,其中sourceValue是bool而T是int?

public static T ConvertTo<T>(Object sourceValue)
{
  // IF IS OF THE SAME TYPE --> RETURN IMMEDIATELY
  if (sourceValue is T)
    return (T) sourceValue;

  var val = ConvertTo(sourceValue, typeof (T));
  return (T) val; 
}

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

你最好写作:

int value = someFlag ? 1 : 0;

答案 2 :(得分:1)

不完全确定您要执行的操作,但.net确实支持将bool转换为int

Convert.ToInt32(true);

它还可以使用object,并确定它是否为bool 另见:Convert.ToInt32(bool)Convert.ToInt32(Object)

答案 3 :(得分:0)

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

public static T ConvertTo(Object sourceValue)
    {
      // IF IS OF THE SAME TYPE --> RETURN IMMEDIATELY
      if (sourceValue is T)
        return (T) sourceValue;

      var val = ConvertTo(sourceValue, typeof (T));

      // SPECIAL CASE: Convert bool(sourceValue) to int(T)
      if (val is bool)
      {
        var b = (bool) val;
        if (b)
          return (T) (object) 1; // if val is true, return 1

        return (T) (object) 0;
      }

      return (T) val;
    }

答案 4 :(得分:0)

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

        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;
        }

    }