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

如何将HttpClient异步结果传入void方法并解决FormatException异常

问题:调用PrintMembers方法抛出FormatException异常如何解决?

现有一段C#代码,通过HttpClient.GetFromJsonAsync获取JSON数据,在Main方法中直接遍历打印IList<User>对象可正常运行,但将结果传入void类型的PrintMembers方法时,抛出异常:

Unhandled exception. System.FormatException: Input string was not in a correct format. Failure to parse near offset 1. Expected an ASCII digit

需要取消注释PrintMembers方法并使其正常工作,原代码如下:

using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Json;
using System.Collections.Generic;
using System.Threading.Tasks;

public class User
{
    public string name { get; set; }
    public string language { get; set; }
    public string id { get; set; }
    public string bio { get; set; }
    public double version { get; set; }

    public string FullName => $"{name} {id}";
}

class Program
{
    // ??? 
/*  public static void PrintMembers(IList<User> ms)
    {
        foreach (var m in ms)
        {
            Console.WriteLine("{m.name}   ||   {m.id}",  m);
        }
        Console.WriteLine();
    }
*/  
    static async Task  Main (string[] args)
    {       
        HttpClientHandler handler = new HttpClientHandler() {
        };  
        HttpClient s_client = new(handler) {
        };

        var res= await s_client.GetFromJsonAsync<IList<User>>("https://www.fireboxtools.com/sample-data/json/64KB-min.json");

        //PrintMembers(res);
        foreach (var item in res)
        {
            Console.WriteLine(item.name);
        }
    }
}

解决方案

异常的核心原因是Console.WriteLine的语法错误:你混淆了字符串插值和复合格式化的用法。原代码中"{m.name} || {m.id}"这种写法,会被当成复合格式化的占位符解析,但m.name不是合法的数字占位符(比如{0}、{1}),所以触发FormatException。

修改PrintMembers方法,二选一即可:

方式1:使用字符串插值(推荐)

在字符串前添加$,直接在花括号内访问对象属性,无需额外传参数:

public static void PrintMembers(IList<User> ms)
{
    foreach (var m in ms)
    {
        Console.WriteLine($"{m.name}   ||   {m.id}");
    }
    Console.WriteLine();
}

方式2:使用复合格式化

用数字占位符对应后面的参数:

public static void PrintMembers(IList<User> ms)
{
    foreach (var m in ms)
    {
        Console.WriteLine("{0}   ||   {1}", m.name, m.id);
    }
    Console.WriteLine();
}

修改后取消注释PrintMembers(res);,即可正常运行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:16:19