Unity-Technologies/UnityCsReference · error · Exception
Id must be a number (line: '{line}')
Error message
Id must be a number (line: '{line}') What it means
Thrown when the rule id (the text after ':' up to the first '|') cannot be parsed as an Int32. Restricted API rule ids must be numeric so they can be used as dictionary keys and for override matching.
Source
Thrown at Editor/Mono/Scripting/RestrictedApisValidation/RestrictedApisConfig.cs:177
var signature = NextToken(ref lineSpan, out separatorIndex);
if (separatorIndex == -1)
throw new Exception($"Invalid severity '' in line '{line}'");
var severitySpan = NextToken(ref lineSpan, out separatorIndex);
var description = "";
var documentationUrl = "";
if (separatorIndex != -1)
{
description = NextToken(ref lineSpan, out separatorIndex).ToString();
if (separatorIndex != -1)
{
documentationUrl = NextToken(ref lineSpan, out separatorIndex).ToString();
}
}
if (!Int32.TryParse(id, out var intId))
{
throw new Exception($"Id must be a number (line: '{line}')");
}
int referenceHashCode;
var isTypeSignature = false;
if (signature.Length == 0)
{
if (!_idToSignatureDetails.TryGetValue(intId, out var previousMappedId))
throw new Exception($"Id ({intId}) overriden in configuration line '{line}' is not defined by any previous lines.");
(referenceHashCode, isTypeSignature) = previousMappedId;
}
else
{
isTypeSignature = line.AsSpan().IndexOf("::") == -1; // member signatures must have a :: as a declaring type name/member name separator
//TODO: When we switch from netstandard to *any* .NET BCL, remove the ToString() and call String.GetHashCode(signature) : https://learn.microsoft.com/en-us/dotnet/api/system.string.gethashcode?view=net-9.0#system-string-gethashcode(system-readonlyspan((system-char)))
referenceHashCode = signature.ToString().GetHashCode();
_idToSignatureDetails[intId] = new (referenceHashCode, isTypeSignature);View on GitHub (pinned to 225b0fbdb5)
Solutions
- Change the id to an integer, e.g. ':1001 | signature | error'.
- Ensure ids are unique and numeric across the file.
Example fix
// before :FILE_OPEN | System.IO.File::Open | error // after :1001 | System.IO.File::Open | error
Defensive patterns
Strategy: validation
Validate before calling
// Rule ids must be integers.
var id = token.Slice(1); // after ':'
if (!Int32.TryParse(id, out _))
throw new FormatException($"Rule id is not a number: '{line}'"); Try / catch
try { config = RestrictedApisConfig.Load(path); }
catch (Exception ex) when (ex.Message.Contains("Id must be a number"))
{ /* replace the non-numeric id with an integer */ } Prevention
- Use numeric ids consistently; track them in a registry to stay unique.
- Avoid string/label ids when authoring rules.
When it happens
Trigger: A rule line whose ':id' token is non-numeric, e.g. ':abc | signature | error'.
Common situations: Using a string/label as an id, typos, or copy-paste from a non-numeric identifier scheme.
Related errors
- Invalid configuration line: '{line}'
- Two consecutive assembly names found; last one: '{line}'
- Invalid severity '' in line '{line}'
- Id ({intId}) overriden in configuration line '{line}' is not
- Invalid severity '{severitySpan.ToString()}' in line '{line}
AI-assisted analysis of Unity-Technologies/UnityCsReference@225b0fbdb5 (2026-08-13).
Data as JSON: /api/errors/8b37dce42b5f1ddd.
Report an issue: GitHub.