babalae/better-genshin-impact · error · ArgumentException
角色名集合中的每个元素都必须是字符串。
Error message
角色名集合中的每个元素都必须是字符串。
What it means
Thrown by ParseCharacterNames during iteration when an element of the characterNames collection is not a string. Each element must be a string (character name); encountering a number, null-reference boxed as object, or other type triggers this immediately.
Source
Thrown at BetterGenshinImpact/GameTask/CharacterDevelopment/CharacterDevelopmentTask.cs:135
internal static List<string> ParseCharacterNames(object characterNames)
{
ArgumentNullException.ThrowIfNull(characterNames);
if (characterNames is string)
{
throw new ArgumentException("多角色接口需要字符串集合或 JS Array,单个字符串请使用 GetCharacter。", nameof(characterNames));
}
if (characterNames is not IEnumerable enumerable)
{
throw new ArgumentException("角色名参数必须是字符串集合或 JS Array。", nameof(characterNames));
}
List<string> names = [];
foreach (var item in enumerable)
{
if (item is not string name)
{
throw new ArgumentException("角色名集合中的每个元素都必须是字符串。", nameof(characterNames));
}
names.Add(NormalizeCharacterName(name));
}
if (names.Count == 0)
{
throw new ArgumentException("角色名集合不能为空。", nameof(characterNames));
}
return names;
}
private static string NormalizeCharacterName(string characterName)
{
var name = characterName?.Trim() ?? string.Empty;
if (string.IsNullOrWhiteSpace(name))
{View on GitHub (pinned to a7cb36712d)
Solutions
- Ensure every element in the collection is a string.
- Filter or convert non-string elements before passing to GetMultiCharacters.
- From JavaScript, verify all array elements are strings.
Example fix
// before (wrong) await dev.GetMultiCharacters(['钟离', 42]); // after await dev.GetMultiCharacters(['钟离', '甘雨']);
Defensive patterns
Strategy: validation
Validate before calling
// Filter the collection to only strings before calling
var validNames = ((IEnumerable)characterNames).OfType<string>().ToList();
if (validNames.Count == 0)
{
throw new ArgumentException("No valid string character names found.");
} Type guard
static bool AllElementsAreString(IEnumerable enumerable)
{
foreach (var item in enumerable)
{
if (item is not string) return false;
}
return true;
} Try / catch
try
{
await dev.GetMultiCharacters(names);
}
catch (ArgumentException ex) when (ex.Message.Contains("都必须是字符串"))
{
// Remove or convert non-string elements
} Prevention
- Ensure all elements in the collection are strings before passing.
- From JavaScript, verify array contains only string values.
- Filter collections with OfType<string>() if unsure of element types.
When it happens
Trigger: Called from ParseCharacterNames foreach loop. An item in the enumerable is not of type string (e.g. a number, boolean, or null boxed as object).
Common situations: JavaScript array contains mixed types: ['钟离', 42, true]; C# List<object> with non-string elements; null elements in the collection.
Related errors
AI-assisted analysis of babalae/better-genshin-impact@a7cb36712d (2026-08-13).
Data as JSON: /api/errors/ebf8e1ee01be783f.
Report an issue: GitHub.