能否让编译器通过赋值目标类型推导泛型函数的返回类型?
C#泛型方法类型推断问题解答
在C#里,你这种场景完全可以省略泛型类型参数,编译器会自动通过变量的预期类型推断出泛型参数T的具体类型。
具体说明
当你把泛型方法的返回值赋值给一个类型明确的变量(比如示例里的bool guessTheType),C#编译器会根据这个变量的类型,自动推导出barFun<T>里的T是bool,所以直接写bool guessTheType = barFun();是完全合法的,编译器会正确识别并执行。
验证示例
你的代码可以直接运行,编译器会把T推断为bool,barFun内部会遍历列表找到true这个bool类型元素并返回,最终guessTheType的值就是true。
如果显式指定泛型类型,写法是bool guessTheType = barFun<bool>();,这和省略后的效果完全一致,只是前者是手动指定,后者是编译器自动推断。
注意事项
- 如果没有明确的目标类型(比如直接写
barFun();不赋值给变量),编译器无法推断T的类型,这时必须显式指定泛型参数,否则会报编译错误。 - 要确保泛型方法内部逻辑能找到对应类型的元素,否则会触发示例里的
Exception。
完整代码示例
public void fooFun() { // 省略泛型类型参数,编译器自动推断T为bool bool guessTheType = barFun(); } private T barFun<T>() { List<Object> objects = new List<Object>(); objects.Add(2); objects.Add("a"); objects.Add(true); foreach (var obj in objects) { if (obj.GetType() == typeof(T)) { return (T)obj; } } throw new Exception(); }
内容的提问来源于stack exchange,提问作者Shuumi
相关产品推荐
相关产品推荐

