34

如果在属性的设置器中有这个:

decimal? temp = value as decimal?;

值 = "90"

但是在演员表之后, temp 为......

做这个演员的正确方法是什么?

4

5 回答 5

70

仅当类型相同时,拆箱才有效!您不能将object不包含目标值的内容拆箱。你需要的是类似的东西

decimal tmpvalue;
decimal? result = decimal.TryParse((string)value, out tmpvalue) ?
                  tmpvalue : (decimal?)null;

这将查看该值是否可解析为decimal. 如果是,则将其分配给result; 否则分配null. 以下代码的作用大致相同,对于不熟悉条件运算符的人来说可能更容易理解?:

decimal tmpvalue;
decimal? result = null;
if (decimal.TryParse((string)value, out tmpvalue))
    result = tmpvalue;
于 2009-02-09T09:02:23.967 回答
6

你应该解析小数。但是,如果您希望您的小数在字符串不正确时为空,请使用 TryParse :

decimal parsedValue;
decimal? temp = decimal.TryParse(value, out parsedValue)
                ? value
                : (decimal?)null;

这样,您将在解析格式错误的字符串时避免异常。

几乎所有原始类型都提供了 Parse 和 TryParse 方法来从字符串转换。

还建议将提供程序参数的区域性传递给方法,以避免小数分隔符出现问题。如果您从另一个系统读取,CultureInfo.InvariantCulture 可能是要走的路(但它不是默认的)。

bool TryParse(string s, NumberStyles style,
  IFormatProvider provider, out decimal result)
于 2009-02-09T09:06:27.093 回答
4

如果您不想解析字符串,但想确保接收到nulladecimal或 nullable decimal,那么您可以执行以下操作:

public static Nullable<T> Convert<T>(object input) 
    where T : struct
{
    if (input == null)
        return null;
    if (input is Nullable<T> || input is T)
        return (Nullable<T>)input;
    throw new InvalidCastException();
}

如果您希望避免异常,您可以让它在最后一行返回 null,尽管这不会区分真正的 null 值和错误的强制转换。

请注意,您必须使用“is”运算符,因为“as”运算符不适用于值类型,并且未经检查的强制转换可能会引发 InvalidCastException。

您也可以将其设为扩展方法:

public static class ObjectExtensions
{
    public static Nullable<T> ToNullable<T>(this object input)
        where T : struct
    {
        if (input == null)
            return null;
        if (input is Nullable<T> || input is T)
            return (Nullable<T>)input;
        throw new InvalidCastException();
    }
}

并像这样使用它:

object value = 123.45m;
decimal? dec = value.ToNullable<decimal>();

这将有助于避免有关取消装箱空引用的代码合同警告。

于 2011-06-28T09:46:46.583 回答
3

如果你使用decimal? temp = (decimal?)value;

于 2009-02-09T09:02:43.013 回答
1

令人惊讶的是,但好的旧System.Convert.ToDecimal(myNullableDoubleBoxedInObject)作品完美无缺:

decimal? myNullableDecimal = 0.15m;
object myNullableDoubleBoxedInObject = myNullableDouble ;
decimal myDecimal = System.Convert.ToDouble(myNullableDoubleBoxedInObject);
于 2020-08-12T02:00:58.717 回答