为什么C#可将匿名类型作为泛型参数传入,却不能作为泛型返回值返回?
问题解答
第一段代码可正常编译的原因
泛型方法的类型推断规则允许从输入参数推导类型参数T的实际类型。你调用f时传入了匿名类型实例,编译器会自动将T推导为该匿名类型,整个方法的泛型绑定完全匹配,不存在类型转换问题,自然可以正常编译。
第二段代码的两个报错原因
错误CS0411:无法从用法推断类型参数
C#的泛型类型推断仅参考方法的输入参数,不会使用返回值的赋值目标类型做推断。你调用f()时没有传入任何参数,编译器没有任何依据可以推导T的实际类型,因此直接报该错误。
错误CS0029:无法将匿名类型隐式转换为T
泛型方法的类型参数T是由调用方决定的,方法的实现必须适配所有符合约束的T类型。你在方法内部硬编码返回一个固定的匿名类型,仅当调用方指定T为该匿名类型或其基类(比如object)时才能成立,无法适配其他任意T的场景,编译器直接判定该实现不合法。
两者的核心差异
第一段代码的T是由调用方的输入决定的,方法是被动适配调用方传入的类型,不存在适配所有T的要求;第二段代码你试图让方法的实现主动决定T的类型,完全违背了泛型方法的设计逻辑,因此无法通过编译。
如果确实需要返回类似结构的强类型结果,可改用C# 7及以上支持的元组类型替代匿名类型,示例如下:
using System; class EntryPoint{ static void Main(){ var obj = f(); Console.WriteLine(obj.Name); // 可正常访问强类型属性 } static (string Name, int Age) f(){ return (Name: "amir", Age: 24); } }
内容的提问来源于stack exchange,提问作者Amir Valizadeh
相关产品推荐
相关产品推荐

