2013-05-02 61 views
12

我想知道什么是最好的方式(在更安全和简洁的意义上)从一个可空类型转换为另一个“兼容”可空类型。转换十进制?加倍?

具体来说,从十进制转换?加倍?可以使用:

public double? ConvertToNullableDouble(decimal? source) 
{ 
    return source.HasValue ? Convert.ToDouble(source) : (double?) null; 
} 

有没有更好的方法来做到这一点?也许利用标准转换?

+0

你的方式是一个好方法。 – SimpleVar 2013-05-02 21:12:32

+1

你做得对!检查此参考:http://stackoverflow.com/questions/5487685/conversion-between-nullable-types – MUG4N 2013-05-02 21:20:12

回答

22

内置铸造的胜利!就在VS2012 VS2010测试此:

decimal? numberDecimal = new Decimal(5); 
decimal? nullDecimal = null; 
double? numberDouble = (double?)numberDecimal; // = 5.0 
double? nullDouble = (double?)nullDecimal;  // = null 

只需使用一个明确的投定投空为null,内部十进制值的两倍。成功!

+0

测试它,并像一个魅力。谢谢,这就是我正在寻找的东西,但我没有想到内置的演员。 – 2013-05-02 21:33:10

+0

这很奇怪,因为像MUG4N这样的问题似乎很多人都有理论,但实际上没有人试过*。 :) – 2013-05-02 21:35:00

+2

事实上*涉及非空值类型源和目标的所有*转换可能会被“提升为空”。 – 2013-05-03 05:52:23

1

在一般情况下,如果你想Ø从任何数据类型的其他转换,只要是兼容的,使用此:

Convert.ChangeType(your variable, typeof(datatype you want convert to)); 

例如:

string str= "123"; 
    int value1 = (int)Convert.ChangeType(str, typeof(int)); 
    float? value2 = (float?)Convert.ChangeType(str, typeof(float)); 
    ................................... 

得远一点,如果你想让它更安全,你可以试试看:

string str= "123"; 
try 
{ 
    int value1 = (int)Convert.ChangeType(str, typeof(int)); 
    int? value2 = (int?)Convert.ChangeType(str, typeof(int)); 
    float value3 = (float)Convert.ChangeType(str, typeof(float)); 
    float? value4 = (float?)Convert.ChangeType(str, typeof(float)); 
} 
catch(Exception ex) 
{ 
    // do nothing, or assign a default value 
} 

这是在VS 20下测试的10

+0

是的,这是在类型之间转换的更一般的方式,并不像接受的答案那么简洁。 @Giswin它是否也适用于可空行?我想是这样,但我没有找到[文件]在这个特定的评论(http://msdn.microsoft.com/en-us/library/dtb69x08.aspx)。 – 2013-05-02 21:35:55

+0

你可以使用这个: 十进制? v1 = 222; double? V2 =(double?)Convert.ChangeType(v1,typeof(double)); 但如果v1为null,则Convert.ChangeType将引发异常。然后尝试赶上左边的工作。 – Gisway 2013-05-02 21:51:26