Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

288
Views
¿Cuándo Type.Namespace devuelve nulo si la instancia representa un parámetro genérico?

La documentación de la propiedad Type.Namespace establece:

Si el Type actual representa un tipo genérico construido, esta propiedad devuelve el espacio de nombres que contiene la definición del tipo genérico. De manera similar, si el Type actual representa un parámetro genérico T , esta propiedad devuelve el espacio de nombres que contiene la definición de tipo genérico que define T.

Si el objeto Type actual representa un parámetro genérico , esta propiedad devuelve un valor nulo.

¿Cuándo Type.Namespace devuelve nulo si la instancia representa un parámetro genérico como en el último párrafo citado? ¿O la documentación es incorrecta y las declaraciones en negrita en realidad se contradicen entre sí?

Para investigar escribí un código simple, pero no he encontrado ninguna respuesta. Todas las declaraciones de Console.WriteLine imprimen algo.

 using System; namespace TypeDemo { internal static class Program { public static void Main() { var g = new G<int>(); gM(4); Console.WriteLine(typeof(G<>).Namespace); } } public class G<T> { static G() { Console.WriteLine(typeof(T).Namespace); } public G() { Console.WriteLine(typeof(T).Namespace); Console.WriteLine(GetType().Namespace); } public void M<S>(S s) { Console.WriteLine(typeof(S).Namespace); Console.WriteLine(s.GetType().Namespace); } } }
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Tenga en cuenta que todos los tipos que está imprimiendo no son parámetros genéricos. Observe cómo cuando se ejecutan los métodos, el tipo ya está construido. Por ejemplo, cuando haces:

 var g = new G<int>(); // which calls... public G() { // T has become "int" here! Console.WriteLine(typeof(T).Namespace); Console.WriteLine(GetType().Namespace); }

Para obtener un Type que represente parámetros genéricos, puede:

[llamar] al método GetGenericArguments de un objeto Type que representa una definición de tipo genérico, o al método GetGenericArguments de un objeto MethodInfo que representa una definición de método genérico.

Fuente

Por ejemplo:

 Console.WriteLine(typeof(Foo.C<>).GetGenericArguments()[0].Namespace); namespace Foo { class C<T> { public void Foo() { } } }

y

 Console.WriteLine(typeof(Foo.C).GetMethod("Foo").GetGenericArguments()[0].Namespace); namespace Foo { class C { public void Foo<T>() { } } }

Ambos imprimen Foo y no he podido encontrar un caso en el que un parámetro de tipo genérico esté en un espacio de nombres, pero su espacio de Namespace devuelve nulo. Esto significa que el comportamiento real coincide con esta oración:

De manera similar, si el tipo actual representa un parámetro genérico T, esta propiedad devuelve el espacio de nombres que contiene la definición de tipo genérico que define a T.

over 4 years ago · Santiago Trujillo Report

0

Los documentos son contradictorios, pero correctos en principio. Type.Namespace devuelve nulo cuando el espacio de nombres no está disponible en la definición genérica. Una forma de obtener esto es MakeGenericMethodParameter:

 Type t=Type.MakeGenericMethodParameter(0); Console.WriteLine("IsGenericParameter: "+t.IsGenericParameter); Console.WriteLine("Namespace: "+(t.Namespace==null?"(null)":t.Namespace));

Otra es tener una implementación de tipo personalizada (es una clase abstracta de la que todos pueden derivar y anular las propiedades para hacer lo que quieran).

Editar: los documentos de Type.Namespace se corrigieron en PR https://github.com/dotnet/dotnet-api-docs/pull/7466/files

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!