{"record":{"id":"3ce7ae0202cfaa47","repo":"jstedfast/MailKit","slug":"one-or-more-of-the-indexes-is-negative","errorCode":null,"errorMessage":"One or more of the indexes is negative.","messagePattern":"One or more of the indexes is negative\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"MailKit/Net/Imap/ImapUtils.cs","lineNumber":280,"sourceCode":"\t\tpublic static void FormatIndexSet (ImapEngine engine, StringBuilder builder, IList<int> indexes)\n\t\t{\n\t\t\tif (engine == null)\n\t\t\t\tthrow new ArgumentNullException (nameof (engine));\n\n\t\t\tif (builder == null)\n\t\t\t\tthrow new ArgumentNullException (nameof (builder));\n\n\t\t\tif (indexes == null)\n\t\t\t\tthrow new ArgumentNullException (nameof (indexes));\n\n\t\t\tif (indexes.Count == 0)\n\t\t\t\tthrow new ArgumentException (\"No indexes were specified.\", nameof (indexes));\n\n\t\t\tint index = 0;\n\n\t\t\twhile (index < indexes.Count) {\n\t\t\t\tif (indexes[index] < 0)\n\t\t\t\t\tthrow new ArgumentException (\"One or more of the indexes is negative.\", nameof (indexes));\n\n\t\t\t\tint begin = indexes[index];\n\t\t\t\tint end = indexes[index];\n\t\t\t\tint i = index + 1;\n\n\t\t\t\tif (i < indexes.Count) {\n\t\t\t\t\tif (indexes[i] == end + 1) {\n\t\t\t\t\t\tend = indexes[i++];\n\n\t\t\t\t\t\twhile (i < indexes.Count && indexes[i] == end + 1) {\n\t\t\t\t\t\t\tend++;\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (indexes[i] == end - 1 && engine.QuirksMode != ImapQuirksMode.hMailServer) {\n\t\t\t\t\t\tend = indexes[i++];\n\n\t\t\t\t\t\twhile (i < indexes.Count && indexes[i] == end - 1) {\n\t\t\t\t\t\t\tend--;","sourceCodeStart":262,"sourceCodeEnd":298,"githubUrl":"https://github.com/jstedfast/MailKit/blob/9d3859a7855e3e17582c07fd01972b8e262bf176/MailKit/Net/Imap/ImapUtils.cs#L262-L298","documentation":"ImapUtils.FormatIndexSet validates each entry of the index list while compressing it into an IMAP sequence set; any negative value makes the sequence set invalid, so it throws an ArgumentException naming the 'indexes' parameter. Message sequence numbers and UIDs are always positive.","triggerScenarios":"Calling GetMessages/GetUids/flag methods with a list containing a negative int (e.g. an uninitialized variable, an arithmetic result, or a 1-based index computed as messageIndex - 1 when messageIndex is 0).","commonSituations":"Off-by-one conversions between 0-based list indices and 1-based IMAP sequence numbers; sentinel values like -1 meaning 'none' passed through unfiltered; data parsed from external sources containing negatives.","solutions":["Validate/filters the list before calling: remove or reject entries where i < 0.","Ensure sequence numbers are converted to 1-based (index + 1) when derived from zero-based positions.","Replace -1 sentinels with a nullable type or explicit skip before building the call."],"exampleFix":"// before\nforeach (var idx in rows) indexes.Add(idx.Position - 1);\nawait folder.AddFlagsAsync(indexes, MessageFlags.Seen, true);\n\n// after\nforeach (var idx in rows) indexes.Add(idx.Position); // keep 1-based\nif (indexes.Any(i => i < 0))\n    throw new InvalidOperationException(\"negative index in input\");\nawait folder.AddFlagsAsync(indexes, MessageFlags.Seen, true);","handlingStrategy":"validation","validationCode":"if (indexes.Any(i => i < 0))\n    throw new ArgumentException(\"indexes must be positive IMAP sequence numbers\", nameof(indexes));","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Remember IMAP sequence numbers are 1-based; convert zero-based positions with +1","Avoid -1 sentinel values in index lists; use nullable types instead","Validate external/parsed data before building sequence sets"],"tags":["imap","argument-validation","negative-value","mailkit"],"backgroundTag":"value-out-of-range","analyzedSha":"9d3859a7855e3e17582c07fd01972b8e262bf176","analyzedAt":"2026-09-15T15:46:11.592Z","contentChangedAt":"2026-09-15T15:46:11.592Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}