Ayende @ Rahien

Hi!
My name is Oren Eini
Founder of Hibernating Rhinos LTD and RavenDB.
You can reach me by phone or email:

ayende@ayende.com

+972 52-548-6969

, @ Q c

Posts: 10 | Comments: 35

filter by tags archive

Generics Challage: Assert Return Types Matches

time to read 13 min | 2573 words

I feel that I gave it too much already, and I am giving up. A workaround is too good for this issue.

Given the following class defination:

public class Dog

{

       public static MethodInfo LastCall = null;

       public class BarkInvocation<T>

       {

              public T Bark()

              {

                     LastCall = (MethodInfo)MethodInfo.GetCurrentMethod();

                     return default(T);

              }

       }

 

       public T Bark<T>()

       {

              return new BarkInvocation<T>().Bark();

       }

}

Can you make this print true?

public class Program

{

       [STAThread]

       static void Main(string[] args)

       {

              Dog d = new Dog();

              d.Bark<IList<string>>();

              Type returnType = Dog.LastCall.ReturnType;

 

              List<string> strings = new List<string>();

 

              Console.WriteLine(returnType.IsInstanceOfType(strings));

       }

}

 


Comments

Weex

IList is not an instance of List, isn't it?

Doug Mayer

Wow, this is a good one. The method's return type will always be T, because at runtime it's resolved from System.RuntimeType.

The only way I'd know of is to also have a LastReturnType static field on Dog and set it to typeof(T) in BarkInvocation.Bark()... which I'm sure there's a reason you're not already doing (I know I hate to add what I feel are more fields that aren't required).

@Weex,

If you do a test as I mention above, you'll see that just calling

typeof(IList).IsInstanceOf(new List());

will return true.

Comment preview

Comments have been closed on this topic.

FUTURE POSTS

  1. Production postmortem: The case of the memory eater and high load - 2 days from now
  2. Production postmortem: The case of the lying configuration file - 3 days from now
  3. Production postmortem: The industry at large - 4 days from now
  4. The insidious cost of allocations - 5 days from now
  5. Find the bug: The concurrent memory buster - 6 days from now

And 4 more posts are pending...

There are posts all the way to Sep 10, 2015

RECENT SERIES

  1. Find the bug (5):
    20 Apr 2011 - Why do I get a Null Reference Exception?
  2. Production postmortem (10):
    14 Aug 2015 - The case of the man in the middle
  3. What is new in RavenDB 3.5 (7):
    12 Aug 2015 - Monitoring support
  4. Career planning (6):
    24 Jul 2015 - The immortal choices aren't
View all series

Syndication

Main feed Feed Stats
Comments feed   Comments Feed Stats