C# 3.0 将布尔值投射到T,其中T为int

C# 3.0 将布尔值投射到T,其中T为int,c#-3.0,int,casting,boolean,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,

如何使此函数可靠地将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; } 公共静态T转换器(对象源值) { //如果是同一类型-->立即返回 if(sourceValue为T) 返回(T)sourceValue; var val=ConvertTo(sourceValue,typeof(T)); 返回(T)val; }
当前,当尝试将false转换为0,将true转换为1时,会引发InvalidCastException。这些类型不是预定义的,这就是为什么这里必须使用泛型。但是,它失败的唯一情况是T:Int32和sourceValue:Boolean。

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

我认为将布尔值转换为整数是未定义的。但是,我也不认为在函数中显式写出这种特殊情况是合适的,否则函数与.NET隐式处理int和bool的方式是不一致的

你最好写下:

int value = someFlag ? 1 : 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; } 公共静态T转换器(对象源值) { //如果是同一类型-->立即返回 if(sourceValue为T) 返回(T)sourceValue; var val=ConvertTo(sourceValue,typeof(T)); //特殊情况:将bool(sourceValue)转换为int(T) if(val是bool) { VarB=(bool)val; 如果(b) 返回(T)(object)1;//如果val为true,则返回1 返回(T)(对象)0; } 返回(T)val; }
不完全确定您想做什么,但.net支持将
bool
转换为
int

Convert.ToInt32(true);
它还可以获取一个
对象
,并判断它是否是
bool

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

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

    }
受保护的空可转换对象(Object sourceValue),其中T:struct,IComparable
{
if(sourceValue为T)
返回(T)sourceValue;
if(sourceValue==null)
{
返回null;
}
尝试
{
var val=Convert.ChangeType(sourceValue,typeof(T));
返回(T)val;
}
捕获(格式化异常)
{
返回null;
}
}

只是好奇,但为什么要使用独立的方法来实现这一点?如果
b
bool
,只需执行
intx=b?1 : 0;。我想他正在寻找一个通用的解决方案,但这个“边缘”案例不适合。可能吧。我只是看不到通用转换方法的用例。我并不是说没有一个有效的,我只是一时想不起来。你的代码甚至不能编译。您的
ConvertTo
方法是否还有第二个重载未发布?如果“bar”是值类型,则不能使用
foo Is bar
is
仅适用于引用类型+1如果类型是预定义的,则这似乎不适用于泛型。
Convert.ToInt32
正是这样做的-将false转换为0,将true转换为1。我想这是有道理的。类型不是预定义的,这就是为什么这里必须使用泛型。但是,它失败的唯一情况是当T:Int32和sourceValue:Boolean时。@标记:这不会编译,与您问题中的原始示例相同。这两个示例都调用了另一个重载的
ConvertTo
方法,您没有向我们展示这个方法。如果你给我们一些我们可以编译和测试的代码,那么我相信有人会帮上忙的。请有人投票反对卢克给出的理由。我没有足够的代表卢克给我的理由。它不编译,因此不是有效答案。如果有人提出了与您在开始时相同的问题,这将不是一个有效的答案。我不再需要解决此问题,但如果有人可以验证此代码是否编译,我会将此标记为答案。