我有一個表有一些可空的雙字段。與LinqToSQL工作試圖用現場直接,我得到如何正確處理LinqToSql類的System.Nullable <T>字段?
參數類型System.Nullable不分配給參數類型雙
如何處理這是否正確?
我有一個表有一些可空的雙字段。與LinqToSQL工作試圖用現場直接,我得到如何正確處理LinqToSql類的System.Nullable <T>字段?
參數類型System.Nullable不分配給參數類型雙
如何處理這是否正確?
這個問題與Linq無關。這與double
和double?
/Nullable<double>
之間的轉換有關。
從double?
到double
隱式轉換是不允許的:
double? foo ;
double bar = foo ;
您可以直接引用的雙重價值:
double? foo ;
double bar = foo.Value ;
,這將拋出一個NullReferenceException
如果Nullable<T>
爲空(即.HasValue
爲false)。
你可以將它轉換:
double? foo ;
double bar = (double) foo ;
同樣,你會得到一個異常,如果Nullabl<T>
爲null。
可以使用空合併運算符來指定一個默認值,如果Nullable<T>
爲null:
double? foo ;
double bar = foo ?? -1.0 ;
這natch,避免NullReferenceException`問題。
您可以使用三元運算在同樣的空合併運算符:
double? foo ;
double bar = (foo.HasValue ? foo.Value : -2) ;
最後,你可以使用普通的條件邏輯遵循另一種路徑:
double? foo ;
double bar ;
if (foo.HasValue)
{
doSomething(foo.Value) ;
}
else
{
doSomething() ;
}
這些是關於選項。哪個是對的?不知道。取決於你的情況。
您可以投它:double yourVariable = (double)ValueFromDb
或者您可以獲取double?
的值:double yourVaraible = ValueFromDb.Value
。兩者都是正確的。
而且兩者都可能爆炸*。考慮'double v = nullabledouble ?? somedefaultdouble',例如'double age = nullableAge ?? Double.NaN'(是的,我計算在這幾天的小數年內;-) – 2011-06-03 22:15:22
請確保您使用第二個版本,通過檢查空值合併運算符'空值'是否爲空值 – Sung 2011-06-03 22:15:38
您可以使用
double value = theObject.TheProperty.GetValueOrDefault();
當你有一個Nullable<T>
,你需要T
類型的值。這將正常化任何null
到的T
的默認值,這將是用於雙0.0。如果你想要的東西其他比默認,你可以解決它的另一種方式。
double value = theObject.TheProperty ?? 1d; // where 1 replaces any null
+1?和'GetValueOrDefault' – 2011-06-03 22:19:33
有兩種方法。
使用可爲空的類型,如double ?.你的實體類可以擁有雙重屬性?並且您的客戶端代碼將與可空類型一起使用。
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public double? Age { get; set; }
public Person()
{
}
public Person(IDataRecord record)
{
FirstName = (string) record["first_name"];
LastName = (string) record["last_name"];
Age = (double?) record["age"];
}
}
編寫選擇一個安全的默認值,如果NULL是目前分配周圍的包裝。我喜歡使用數據記錄類的擴展方法,並在其中放置一個SafeConvert方法。
這真的和LINQ無關。考慮一個更通用的SO搜索來處理Nullable值。 – 2011-06-03 22:17:48
你應該真的發佈實際的代碼以及實際的錯誤信息。請不要讓我們猜你正在嘗試做什麼。 – Gabe 2011-06-03 22:24:17