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
相关产品推荐
相关产品推荐

