当实例表示泛型参数时,Type.Namespace属性在什么情况下会返回null
关于Type.Namespace文档歧义与返回null的场景说明
官方文档的表述存在歧义,两处加粗描述指向的是完全不同的Type对象,并非文档错误:
- 第一处描述中提到的「表示泛型参数T」,实际指向构造泛型类型/构造泛型方法中,已经绑定了具体类型实参的泛型参数对应的类型对象,你测试代码中所有
typeof(T)、typeof(S)拿到的都是这类对象:你实例化的是G<int>,调用的是M<int>,这里的T和S都已经被替换为int类型,本质上拿到的是System.Int32的类型对象,自然有对应的命名空间。 - 第二处描述中提到的「表示泛型参数」,指向的是泛型类型定义/泛型方法定义中,还未绑定任何实参的泛型形参本身的类型对象,只有这种场景下
Type.Namespace才会返回null。
你可以运行下面的代码复现返回null的场景:
using System; namespace TypeDemo { public class G<T> { public void M<S>(S s) {} } internal static class Program { public static void Main() { // 获取泛型类型定义G<>的未绑定泛型形参T Type genericTypeParam = typeof(G<>).GetGenericArguments()[0]; Console.WriteLine(genericTypeParam.Namespace); // 输出 null // 获取泛型方法定义M<>的未绑定泛型形参S Type genericMethodParam = typeof(G<>).GetMethod("M").GetGenericArguments()[0]; Console.WriteLine(genericMethodParam.Namespace); // 输出 null } } }
你之前的测试代码没有复现的核心原因是:所有泛型参数都已经被绑定了具体的实参类型,拿到的Type对象本质是实参的类型,而非泛型形参本身。
内容的提问来源于stack exchange,提问作者chrisc
相关产品推荐
相关产品推荐

