我有一个带有一些可以为空的双字段的表。使用LinqToSQL尝试直接使用该字段我得
参数类型System.Nullable不能分配给参数类型double
如何正确处理?
答案 0 :(得分:20)
问题与Linq无关。这与double
和double?
/ Nullable<double>
之间的转换有关。
不允许从double?
隐式转换为double
:
double? foo ;
double bar = foo ;
您可以直接引用double值:
double? foo ;
double bar = foo.Value ;
如果NullReferenceException
为空(即Nullable<T>
为false),则会抛出.HasValue
。
你可以施展它:
double? foo ;
double bar = (double) foo ;
同样,如果Nullabl<T>
为空,您将获得例外。
如果Nullable<T>
为空,您可以使用空合并运算符来指定默认值:
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() ;
}
这些是关于选项的。哪个是对的?不知道。取决于你的背景。
答案 1 :(得分:9)
您可以使用
double value = theObject.TheProperty.GetValueOrDefault();
如果您有Nullable<T>
,则需要T
类型的值。这会将任何null
规范化为默认值T
,对于双精度值将为0.0。如果你想要一些其他而不是默认的东西,你可以用另一种方式解决它。
double value = theObject.TheProperty ?? 1d; // where 1 replaces any null
答案 2 :(得分:2)
有两种方法。
使用可以为空的类型,例如double?。您的实体类可以具有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方法。
答案 3 :(得分:-1)
你可以投了它:double yourVariable = (double)ValueFromDb
或者你可以抓住double?
:double yourVaraible = ValueFromDb.Value
的价值。要么是正确的。