如果在属性的 setter 中有以下代码:
decimal? temp = value as decimal?;
value = "90"
但是在转换后,temp变成了null...
如何才能正确地进行这种类型转换?
只有类型相同才能进行拆箱操作!你不能拆箱一个不包含目标值的 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;
你应该解析十进制数。但如果你希望在字符串不正确时使你的十进制数为空,使用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)
如果你不想解析字符串,但希望确保只接收到 null
、decimal
或可空的 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();
}
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>();
and if you use decimal? temp = (decimal?)value;
令人惊讶的是,但是老式的System.Convert.ToDecimal(myNullableDoubleBoxedInObject)
非常完美地工作:
decimal? myNullableDecimal = 0.15m;
object myNullableDoubleBoxedInObject = myNullableDouble ;
decimal myDecimal = System.Convert.ToDouble(myNullableDoubleBoxedInObject);
简单对象扩展也可以解决问题:
public static class ObjectExtensions
{
public static decimal ToDecimal(this object obj)
{
return System.Convert.ToDecimal(obj);
}
}
decimal? number = obj?.ToDecimal();