双重有什么区别?和一个双,为什么我不能隐式转换它们?

时间:2009-10-01 01:44:27

标签: c# linq-to-sql

Visual Studio对我大喊大叫,在数据库中它是一个浮点数,而在我的课堂上它是双重的。为什么我不能分配它,为什么它认为它是'双重'? ?

以下三行

    Confirmation confirm = new Confirmation();

    confirm.order = theOrder;

    confirm.totalPrice = theOrder.BillingAmount;

这是确认DEF

    public class Confirmation
    {
        public Order order;

        public List<OrderItem> allProducts;

        public double totalPrice;
    }

这是BillingAmount DEF代码,我认为是从.dbml中生成的.draggy-droppy ...

[Column(Storage="_BillingAmount", DbType="Float")]
        public System.Nullable<double> BillingAmount
        {
            get
            {
                return this._BillingAmount;
            }
            set
            {
                if ((this._BillingAmount != value))
                {
                    this.OnBillingAmountChanging(value);
                    this.SendPropertyChanging();
                    this._BillingAmount = value;
                    this.SendPropertyChanged("BillingAmount");
                    this.OnBillingAmountChanged();
                }
            }
        }

5 个答案:

答案 0 :(得分:6)

在db中,如果您的列可以为空,则在C#中将其表示为Nullable<double>。 double,作为值类型,不能为null ...但在db术语中,这是完全合法的。这就是.Net具有Nullable<T>类型的原因。您可以通过执行以下任何操作将其值分配给double:

double d = nullableDouble ?? 0;
double d = (nullableDouble.HasValue) ? nullableDouble.Value : 0;

等...

答案 1 :(得分:2)

double?Nullable<double>的简写。这是一种完全不同的类型。我的回忆是你可以隐式地在它们之间进行转换,但只能在一个方向上转换(从doubledouble?)。另一个方向没有意义,因为在double?为空的情况下,不存在转换。数据库代码使用可空双精度的原因是,在数据库中,值可能为NULL。

答案 2 :(得分:1)

一双?是双重的可空版本,可以表示“未知”值,也可以表示最终的双重值。 double和float之间的区别在于double的精度和范围是float的两倍。

所以你应该能够隐式地将任何浮点转换为双精度,但不能反过来,就像你可以将任何短整数(-32,768到+32769)转换为长( - 20亿到+20亿) ),不是相反的。

编辑:   所以你也可以隐式地将double转换为可以为空的double(double?)但不是相反(它可能为null)。

但你仍然可以转换一个可以为空的双 明确 。如果它有一个确定的值,那么你可以通过强制转换它,或通过访问double的“Value”属性来转换它?

   double? nulbleDbl = 123.456;
   double?   nullDbl = null;
   double x = nulbleDbl.Value;  //works just fine
   double y = nullDbl.Value;  // fails with convert error or cast error
   bool isOk = nullDbl.HasValue;  // returns false

答案 3 :(得分:1)

转换双倍的方式?双重是:

double? nullDouble = null;
double normaDouble = nullDouble ?? 0; 
  // where 0 is the default value used if nullDouble is null

这与:

相同
normalDouble = (nullDouble.HasValue) ? nullDouble.Value : 0;

或     normalDouble =(nullDouble!= null)? nullDouble.Value:0;

答案 4 :(得分:0)

数据库中的列必须是允许空值,因为双重?生成了。因此,如果它可以为null,则意味着它可能无法从您的程序中获取值。那么也许你应该选择双倍?或者加倍,但要在任何地方使用它(也许不允许在数据库中使用空值)。