如果在属性的设置器中有这个:
decimal? temp = value as decimal?;
值 = "90"
但是在演员表之后, temp 为空......
做这个演员的正确方法是什么?
仅当类型相同时,拆箱才有效!您不能将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
adecimal
或 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>();
这将有助于避免有关取消装箱空引用的代码合同警告。
如果你使用decimal? temp = (decimal?)value;
令人惊讶的是,但好的旧System.Convert.ToDecimal(myNullableDoubleBoxedInObject)
作品完美无缺:
decimal? myNullableDecimal = 0.15m;
object myNullableDoubleBoxedInObject = myNullableDouble ;
decimal myDecimal = System.Convert.ToDouble(myNullableDoubleBoxedInObject);