我有一个表有一些可空的双字段。与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