![](/img/trans.png)
[英]How does the assignment of the null literal to a System.Nullable<T> type get handled by .Net (C#)?
[英]How to correctly deal with System.Nullable<T> fields of LinqToSql classes?
我有一个带有一些可以为空的双字段的表。 使用 LinqToSQL 尝试直接使用该字段我得到
参数类型 System.Nullable 不可分配给参数类型 double
我该如何正确处理?
该问题与Linq无关。 它与double
和double?
/ Nullable<double>
。
从double?
不允许double
:
double? foo ;
double bar = foo ;
您可以直接引用双精度值:
double? foo; double bar = foo.Value;
如果Nullable<T>
为 null(即.HasValue
为假),这将引发NullReferenceException
。
你可以投射它:
double? foo; double bar = (double) foo;
同样,如果Nullabl<T>
为 null,您将再次遇到异常。
如果Nullable<T>
为 null,您可以使用 null 合并运算符分配默认值:
double? foo; double bar = foo?? -1.0;
这自然避免了 NullReferenceException` 问题。
您可以使用与 null 合并运算符相同的三元运算符:
double? foo; double bar = ( foo.HasValue? foo.Value: -2 );
最后,您可以使用常规条件逻辑来遵循替代路径:
double? foo; double bar; if ( foo.HasValue ) { doSomething(foo.Value); } else { doSomething(); }
这些是关于选项的。 哪个是对的? 我不知道。 这取决于您的上下文。
您可以使用
double value = theObject.TheProperty.GetValueOrDefault();
当你有一个Nullable<T>
并且你需要一个T
类型的值时。 这会将任何null
标准化为默认值T
,对于双精度值,该值将是 0.0。 如果您想要默认值以外的其他内容,则可以通过另一种方式解决它。
double value = theObject.TheProperty ?? 1d; // where 1 replaces any null
有两种方法。
使用可空类型,例如 double?。 您的实体 class 可以具有 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 存在,则围绕选择一个安全默认值的分配编写一个包装器。 我喜欢使用数据记录 class 的扩展方法并在那里放置一个 SafeConvert 方法。
您可以将其转换为: double yourVariable = (double)ValueFromDb
或者您可以只获取double?
: double yourVaraible = ValueFromDb.Value
。 要么是正确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.