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

  1. Ensure every element in the collection is a string.
  2. Filter or convert non-string elements before passing to GetMultiCharacters.
  3. 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

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.