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

C#中如何向函数传递泛型类型参数引用?

解决方案

直接修复编译错误

报错的核心原因是Inquire<T>类声明了where T: class的泛型约束,要求T必须是引用类型,但你定义的Inquiry<T>方法没有添加相同约束,编译器无法保证传入的T符合Inquire<T>的类型要求。只需给Inquiry<T>补充相同的约束即可:

public T Inquiry<T>(T obj) where T : class
{
    string Username = "myUser";
    Task<T> myTask = Inquire<T>.GetInquiry(Username);
    obj = myTask.Result;
    return obj;
}

优化异步调用(避免阻塞)

上述代码使用myTask.Result会直接阻塞当前线程,违背了异步方法的设计初衷,建议将Inquiry<T>改造为异步方法:

public async Task<T> InquiryAsync<T>(T obj) where T : class
{
    string Username = "myUser";
    obj = await Inquire<T>.GetInquiry(Username);
    return obj;
}

重构建议

1. 调整Inquire类的泛型定义

将泛型约束从类级别移到方法级别,让类本身非泛型,提升使用灵活性:

public static class Inquire
{
    public static async Task<T> GetInquiry<T>(string Username) where T : class
    {
        // 原有查询逻辑
    }
}

2. 移除冗余参数

你的Inquiry<T>方法中,参数obj仅作为类型标记,实际未被使用(直接被查询结果覆盖),可以直接移除简化方法:

public async Task<T> InquiryAsync<T>() where T : class
{
    string Username = "myUser";
    return await Inquire.GetInquiry<T>(Username);
}

3. 遵循异步方法命名规范

按照C#开发惯例,异步方法应统一以Async结尾,方便调用者识别异步特性,避免误用同步阻塞逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:00:42