.net F#将none传递给函数,将null作为参数值

.net F#将none传递给函数,将null作为参数值,.net,f#,.net,F#,这真的很奇怪,我担心我刚刚做了一些愚蠢的事情,但我无法理解 我将None作为第一个参数传递给函数some,但是当函数执行时,parentNode的值为null(我不关心它为None打印null,函数参数值为null而不是None)。由于parentNode为null,我在print函数行上得到一个null引用错误。我尝试对参数进行二元组化并更改顺序,但没有起到任何作用。我暗自怀疑这与咖喱有关,但我不知所措 对于公司问题,我不得不用一个空字符串替换真实的url值,但如果有帮助的话,它是指向xsd的

这真的很奇怪,我担心我刚刚做了一些愚蠢的事情,但我无法理解

我将
None
作为第一个参数传递给函数
some
,但是当函数执行时,
parentNode
的值为null(我不关心它为
None
打印null,函数参数值为null而不是
None
)。由于parentNode为null,我在print函数行上得到一个null引用错误。我尝试对参数进行二元组化并更改顺序,但没有起到任何作用。我暗自怀疑这与咖喱有关,但我不知所措

对于公司问题,我不得不用一个空字符串替换真实的url值,但如果有帮助的话,它是指向xsd的url

代码如下:

#light
open System
open System.Xml
open System.Net
open System.Collections.Generic

type StartResult =
    | Parameters of XsdParserParameters
    | Xsd of Xsd

and Xsd(text) =
    let rows = new List<string>()

    member this.Text
        with get() = text

    member this.Rows
        with get() = rows

and XsdParserParameters() =
    let mutable url = ""

    member this.Url
        with get() = url
        and set(value) = url <- value

    member this.Start() =
        try
            use client = new WebClient()
            let xsd = client.DownloadString(this.Url)
            StartResult.Xsd(Xsd(xsd))
        with e ->
            StartResult.Parameters(this)

let processor () =
    let parameters = XsdParserParameters()
    parameters.Url <- ""
    match parameters.Start() with
    | StartResult.Parameters(xpparams) ->
        //some error
        ()
    | StartResult.Xsd(xsd) ->

        let rec some (parentNode : XmlNode option) (node : XmlNode) =
            let a = ()

            for subNode in node.ChildNodes do
                match subNode.LocalName with
                | "complexType" ->
                    xsd.Rows.Add(
                        sprintf
                            "%O~%s~%d~%d~%s~%s~%O" 
                            parentNode 
                            subNode.Value 
                            1 
                            1 
                            (subNode.Attributes.GetNamedItem("name").Value)
                            "" 
                            false)
                    some (Some(subNode)) subNode 
                | "sequence" ->
                    some parentNode subNode 
                | "element" ->
                    xsd.Rows.Add(
                        sprintf 
                            "%O~%s~%d~%d~%s~%s~%O" 
                            parentNode 
                            subNode.Value 
                            1 
                            1 
                            (subNode.Attributes.GetNamedItem("name").Value) 
                            "" 
                            false)
                    some (Some(subNode)) subNode 
                | _ ->
                    ()

        let xdoc = new XmlDocument();
        xdoc.LoadXml(xsd.Text)

        some (None) (xdoc.DocumentElement)

processor()

printfn "Done..."
Console.ReadLine() |> ignore
#灯
开放系统
开放系统.Xml
开放系统.Net
open System.Collections.Generic
类型StartResult=
|XsdParserParameters的参数
|Xsd的Xsd
和Xsd(文本)=
让行=新列表()
请各位议员发言
使用get()=文本
请记住这一行
使用get()=行
和XsdParserParameters()=
让可变url=“”
请输入此.Url
使用get()=url
和设置(值)=url
StartResult.参数(此)
let处理器()=
let parameters=XsdParserParameters()
参数Url
//一些错误
()
|StartResult.Xsd(Xsd)->
让我们记录一些(parentNode:XmlNode选项)(节点:XmlNode)=
设a=()
对于node.ChildNodes中的子节点
将subNode.LocalName与匹配
|“complexType”->
xsd.Rows.Add(
把格式数据写成串
%O~%s~%d~%d~%s~%s~%O
父节点
子节点值
1.
1.
(subNode.Attributes.GetNamedItem(“名称”).Value)
"" 
(错误)
一些(一些(子节点))子节点
|“顺序”->
某些父节点子节点
|“要素”->
xsd.Rows.Add(
斯普林特
%O~%s~%d~%d~%s~%s~%O
父节点
子节点值
1.
1.
(subNode.Attributes.GetNamedItem(“名称”).Value)
"" 
(错误)
一些(一些(子节点))子节点
| _ ->
()
设xdoc=newxmldocument();
xdoc.LoadXml(xsd.Text)
部分(无)(xdoc.DocumentElement)
处理器()
printfn“完成…”
Console.ReadLine()|>忽略

不幸的是,F#打印出

> sprintf "%O" None;;
val it : string = "<null>"

option这很好,是意料之中的事。问题是第一个参数没有得到“none”,而是得到null。我更新了我的问题以澄清为什么这样做:>printfn“%O”无?该错误是否也应该使用空引用来解决?那么匹配语句呢?我可以匹配None、null或两者吗?@Brad:因为
printf
在尝试调用
ToString()
之前会检查null并打印“”。这同样有效:
printfn“%O”null
@Brad:Yes,您可以在
None
/
null
上进行匹配。请尝试:
Some(1)。Value
(None:int选项)。Value
()。ToString()
在哪一行上出现空引用异常
sprintf“%O”null
应该可以正常工作,而且我没有看到任何其他对
parentNode
的引用,您确定这就是错误的来源吗?
let sprintOption v = 
    if Option.isNone v then "None" else sprintf "%A" v