如果在属性的setter中有这个:
decimal? temp = value as decimal?;
value =“90”
但是在演员表之后,temp是 null ......
进行此演员表的正确方法是什么?
答案 0 :(得分:66)
只有在类型相同的情况下,取消装箱才有效!您无法取消包含不包含目标值的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;
答案 1 :(得分:5)
你应该解析小数。但是,如果您希望在字符串不正确时将小数设为null,请使用TryParse:
decimal parsedValue;
decimal? temp = decimal.TryParse(value, out parsedValue)
? value
: (decimal?)null;
通过这种方式,您可以在解析格式化的字符串时避免异常。
几乎所有原始类型都提供了从字符串转换的Parse和TryParse方法。
还建议将provider参数的文化传递给方法,以避免小数分隔符出现问题。如果你正在读取另一个系统,那么CultureInfo.InvariantCulture可能就是这样(但它不是默认的)。
bool TryParse(string s, NumberStyles style,
IFormatProvider provider, out decimal result)
答案 2 :(得分:2)
如果您使用decimal? temp = (decimal?)value;
答案 3 :(得分:2)
如果您不想解析字符串,但希望确保收到null
,decimal
或可空decimal
,那么您可以执行以下操作:< / p>
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,尽管这不会区分真正的空值和坏的转换。
请注意,您必须使用“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>();
这有助于避免有关取消装箱空引用的代码合同警告。
答案 4 :(得分:1)
令人惊讶的是,旧的System.Convert.ToDecimal(myNullableDoubleBoxedInObject)
可以完美地工作:
decimal? myNullableDecimal = 0.15m;
object myNullableDoubleBoxedInObject = myNullableDouble ;
decimal myDecimal = System.Convert.ToDouble(myNullableDoubleBoxedInObject);