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();
}
}
}
答案 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>
的简写。这是一种完全不同的类型。我的回忆是你可以隐式地在它们之间进行转换,但只能在一个方向上转换(从double
到double?
)。另一个方向没有意义,因为在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,则意味着它可能无法从您的程序中获取值。那么也许你应该选择双倍?或者加倍,但要在任何地方使用它(也许不允许在数据库中使用空值)。