所以,我有一个简单的结构,只包含一个多维的字符串数组,看起来像这样
type Structure =
struct
val mutable SubText: string[][]
end
在另一个函数中,我们有类似的东西:
let mutable Struct : Structure = new Structure()
let stringArray = [| "string1"; "string2"; "string3" |]
Struct.SubText.[0] <- stringArray
但是只要程序到达这个部分,我们就会得到一个NullReferenceException
我想知道如何解决这个问题,谢谢。 我确实看到了另一个问题几乎相同的问题,但这与2d int数组有关,而不是字符串
答案 0 :(得分:2)
您正在尝试设置外部数组的第一项,但此时您的数组数组仍为null;因此例外。
我真的不明白你在哪里使用所有可变的数组和数组,所以只需要一个快速的解决方法来修复代码:
let mutable Struct = Structure ()
let stringArray = [| "string1"; "string2"; "string3" |]
Struct.SubText <- [| stringArray |]
我只是将整个外部数组设置为包含您的数组的数组,您也可以执行两步过程,例如
let mutable Struct = Structure ()
let stringArray = [| "string1"; "string2"; "string3" |]
Struct.SubText <- Array.zeroCreate 5
// now SubText.[0] exists
Struct.SubText.[0] <- stringArray
// > Struct.SubText;;
// val it : string [] [] = [|[|"string1"; "string2"; "string3"|]; null; null; null; null|]
答案 1 :(得分:1)
当Struct
的实例由默认的无参数struct
构造函数构造时,表示SubText
的jugged数组的结构字段string
保持未初始化,因此索引器Struct.SubText.[0]
被应用于null
值,这就是抛出异常的原因。
您可以通过向默认的no-arg struct
构造函数添加一些在实例构造时初始化SubText
的额外显式构造函数来轻松解决此问题:
type Structure =
struct
val mutable SubText: string[][]
end
new(size) = {SubText = Array.zeroCreate size} // to array of given number of string arrays
new(_) = {SubText = [|[||]|]} // to array of single empty string array
现在您可以使用如下所示的构造函数,在实例构造时初始化字段SubText
并且可以使用索引器:
let Struct = new Structure(2) // or just let Struct = new Structure(())
let stringArray = [| "string1"; "string2"; "string3" |]
Struct.SubText.[0] <- stringArray
//Checking out in FSI:
//>Struct.SubText.[0];;
//val it : string [] = [|"string1"; "string2"; "string3"|]
当SubText
被选为mutable
时,它可以随时更改为任意数量子阵列的另一个jugged数组,不一定是初始size
。