【发布时间】:2012-05-24 23:19:46
【问题描述】:
鉴于以下情况:
[<DataContract>]
type TweetUser = {
[<field:DataMember(Name="followers_count")>] Followers:int
[<field:DataMember(Name="screen_name")>] Name:string
[<field:DataMember(Name="id_str")>] Id:int
[<field:DataMember(Name="location")>] Location:string}
[<DataContract>]
type Tweet = {
[<field:DataMember(Name="id_str")>] Id:string
[<field:DataMember(Name="text")>] Text:string
[<field:DataMember(Name="retweeted")>] IsRetweeted:bool
[<field:DataMember(Name="created_at")>] DateStr:string
[<field:DataMember(Name="user", IsRequired=false)>] User:TweetUser
[<field:DataMember(Name="sender", IsRequired=false)>] Sender:TweetUser
[<field:DataMember(Name="source")>] Source:string}
使用 DataContractJsonSerializer(typeof<Tweet[]>) 反序列化将导致 User 或 Sender 字段为空(至少调试器告诉我的是这样)。
如果我尝试编写以下内容:
let name = if tweet.User <> null
then tweet.User.Name
else tweet.Sender.Name
编译器发出错误:“类型'TweetUser'没有'null'作为正确值”
在这种情况下如何测试空值?
【问题讨论】:
-
if tweet.User <> Unchecked.defaultof<_>有效吗?如果没有,那么总会有AllowNullLiteralattribute。 -
Unchecked.defaultof<_> 编译但在运行时不起作用(与 null 不正确匹配)。 AllowNullLiteral 对记录字段无效。不过建议很好。
标签: f#