{"record":{"id":"b7e692d13d4c8d51","repo":"egametang/ET","slug":"string","errorCode":null,"errorMessage":"如果项非string类型，则必需设置解析器","messagePattern":"如果项非string类型，则必需设置解析器","errorType":"exception","errorClass":"NullReferenceException","httpStatus":null,"severity":"error","filePath":"Packages/cn.etetet.packagemanager/Editor/Tools/StrConv.cs","lineNumber":333,"sourceCode":"        {\n            if (string.IsNullOrEmpty(valueIn))\n            {\n                valueOut = new T[0];\n                return true;\n            }\n\n            string[] strValueArr = valueIn.Split(new[] { separator }, StringSplitOptions.None);\n\n            Type tType = typeof(T);\n            if (typeof(string) == tType)\n            {\n                valueOut = strValueArr as T[];\n                return true;\n            }\n\n            if (parse == null)\n            {\n                throw new NullReferenceException(\"如果项非string类型，则必需设置解析器\");\n            }\n\n            valueOut = new T[strValueArr.Length];\n            for (int i = 0; i < strValueArr.Length; i++)\n            {\n                valueOut[i] = parse(strValueArr[i]);\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// 通过一定规则，把字答串数组转为对应类型数组\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"values\"></param>\n        /// <param name=\"parse\"></param>\n        /// <returns></returns>","sourceCodeStart":315,"sourceCodeEnd":351,"githubUrl":"https://github.com/egametang/ET/blob/5cab01f7a8bee5f49f4781eebe9e2b1c6d7ebe0f/Packages/cn.etetet.packagemanager/Editor/Tools/StrConv.cs#L315-L351","documentation":"StrConv.ToArr<T> splits a string into an array of T. When T is not string, the caller must supply a parse delegate (Func<string,T>) to convert each segment. If parse is null for a non-string T, a NullReferenceException is thrown with this message. This is a developer-contract violation, not a runtime data error.","triggerScenarios":"Calling ToArr<int>(valueIn, sep, out arr, null) or any non-string T with a null parser argument; a refactor changed T from string to another type but forgot to pass the parser.","commonSituations":"Configuration/table import code that parses typed arrays but the parser lambda was omitted; copy-paste of a ToArr call where the parse argument was dropped.","solutions":["Pass a valid parse delegate, e.g. ToArr(valueIn, sep, out arr, int.Parse).","If T is genuinely string, ensure the generic argument is string so the early-return path is taken.","Add a compile-time/unit test that ToArr is never called with null parse for value types."],"exampleFix":"// before\nStrUtil.ToArr<int>(raw, \",\", out int[] vals, null);\n\n// after\nStrUtil.ToArr<int>(raw, \",\", out int[] vals, int.Parse);","handlingStrategy":"validation","validationCode":"if (typeof(T) != typeof(string) && parse == null) { throw new ArgumentException(\"parse is required for non-string T\"); }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pass a parser for non-string T when calling ToArr.","For string arrays, rely on the string fast path (no parser needed).","Add a unit test asserting ToArr throws clearly when parse is null."],"tags":["packagemanager","editor","parsing","validation"],"backgroundTag":null,"analyzedSha":"5cab01f7a8bee5f49f4781eebe9e2b1c6d7ebe0f","analyzedAt":"2026-08-13T21:10:40.377Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}