2012-05-03 28 views
5

これは本当に奇妙なことです。私はちょうど何かばかなことをしたことを恐れていますが、私はそれを理解できません。F#が機能しなくなり、パラメータ値としてnullが返される

私はそれがNoneためにヌル印刷に関係していないよ(私は最初のパラメータとしての機能someNoneを渡しているが、関数の実行時、parentNodeの値がnullの場合、関数パラメータの値がNone nullではありません)。 parentNodeがnullなので、print関数の行でヌル参照エラーが発生することになります。私はargsをタプルして順序を変更しようとしましたが、それは助けになりませんでした。私はこれがカリングと関係があることを疑っていますが、私は迷っています...

実際のURL値を会社の問題の空の文字列に置き換えなければなりませんでしたが、xsdそれがここに

に役立つコードの場合:残念ながら

#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 
+0

null参照例外はどの行で取得されていますか? 'sprintf"%O "null"はうまく動作するはずです。私は 'parentNode'への他の参照を見ません。エラーがどこから来ているのでしょうか? – Guvante

答えて

4

、それは方法は、F#のプリントアウトNoneです:あなたは簡単にカスタムを書くことができます

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

例えばoptionタイプの機能:

let sprintOption v = 
    if Option.isNone v then "None" else sprintf "%A" v 
+0

これは大丈夫です。問題は、最初のパラメータがnullを取得する "none"を取得しないということです。 – Brad

4

Option<'T>source on Github)は、実行時にnullで表さする(この例では、None)引数なしの場合を引き起こす属性[<CompilationRepresentation([CompilationRepresentationFlags.UseNullAsTrueValue)>]を使用します。

+0

なぜこれが機能するのですか?> printfn "%O"なし;; ? null参照でもそのエラーを出力する必要がありますか?そしてマッチステートメントはどうですか? None、null、またはその両方で一致することはできますか? – Brad

+1

@ブラッド: 'printf'は' ToString() 'を呼び出す前にnullをチェックして" "を出力します。これもうまくいきます: 'printfn"%O "null"。 – Daniel

+0

@ブラッド:はい、 'None' /' null'でマッチさせることができます。 – Daniel

関連する問題