You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dictionary<int,ItemTemplate>调用时string转int参数错误求助

解决Dictionary<int, ItemTemplate>参数类型不匹配问题

从你给出的错误信息来看,问题非常明确:你在调用System.Collections.Generic.Dictionary<int,ItemTemplate>的ContainsKey(int)方法和索引器this[int]时,传入的是string类型的参数,但这两个成员都要求接收int类型的键值,所以才会抛出「无法将string转换为int」以及「最佳重载匹配无效」的错误。

核心解决方案:将字符串参数转换为int类型

你需要从输入的text中提取出代表键的字符串部分,然后安全地转换为int类型,再去调用Dictionary的相关方法。这里推荐两种转换方式:

1. 安全转换(推荐):使用int.TryParse

这种方式会检查字符串是否能合法转换为int,避免因输入格式错误导致程序崩溃,非常适合处理用户输入的场景(比如你的GM命令输入):

public partial class Chat 
{ 
    void OnSubmit_GMAddon(string text) 
    { 
        var player = Utils.ClientLocalPlayer(); 
        if (!player || !player.admin || Utils.IsNullOrWhiteSpace(text)) 
            return;

        // 假设你的GM命令格式是类似 "additem 123",拆分文本获取键的字符串部分
        var commandParts = text.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
        if (commandParts.Length < 2)
        {
            // 提示用户输入格式错误,可根据你的项目逻辑调整提示方式
            // Utils.SendChatMessage("命令格式错误,请输入:additem [物品ID]");
            return;
        }

        string keyStr = commandParts[1];
        int itemId;
        if (int.TryParse(keyStr, out itemId))
        {
            // 转换成功,现在可以用int类型的itemId调用Dictionary
            // 假设你的Dictionary实例名为itemTemplates
            if (itemTemplates.ContainsKey(itemId))
            {
                var targetItem = itemTemplates[itemId];
                // 这里执行你的GM添加物品逻辑,比如player.AddItem(targetItem);
            }
            else
            {
                // 提示用户该物品ID不存在
                // Utils.SendChatMessage($"不存在ID为{itemId}的物品模板");
            }
        }
        else
        {
            // 提示用户输入的不是有效数字
            // Utils.SendChatMessage("请输入有效的物品ID(数字)");
        }
    } 
}

2. 直接转换(仅当确定字符串是合法int时使用):使用int.Parse

如果你能100%保证从text中提取的字符串是合法的整数(比如内部测试场景),可以直接用int.Parse,但如果字符串格式错误会抛出异常:

string keyStr = "从text中提取的数字字符串";
int itemId = int.Parse(keyStr);
if (itemTemplates.ContainsKey(itemId))
{
    var targetItem = itemTemplates[itemId];
    // 后续逻辑
}

额外提醒

  • 一定要确保你从text中拆分出的是正确的数字部分,比如如果你的命令有其他参数,要准确拿到对应位置的字符串。
  • 永远优先使用int.TryParse处理用户输入,因为你无法保证用户会输入合法的数字,这种方式能让你的代码更健壮。

内容的提问来源于stack exchange,提问作者Mine Stuuf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:57:56