On Feb 6, 2013, at 10:28 AM, Stuart Golodetz <stu...@semmle.com> wrote:
> do you know whether the distinction being made by Mono between a generic type 
> and the instance type corresponding to it is only of relevance to the 
> compiler, or does it have real implications for an application-level 
> developer?

It would be helpful if you used existing/"normal" terminology; I _think_ your'e 
talking about "open generic types" (e.g. List<T>) vs. "closed generic types 
(e.g. List<int>).

Assuming that's the case, then yes, this does have implications for app 
developers. Suppose you wanted to know if a type implemented IList<T>, but you 
didn't care about the T?

        // Does FooCollection implement IList<T>?
        class FooCollection : Collection<Foo> {
        }

Here, you do need to care about the difference between open and closed generic 
types:

        csharp> typeof(FooCollection).BaseType.GetInterfaces().Any(i => i == 
typeof(IList<Foo>));
        true

The above requires that we know the closed generic type IList<Foo>. What if we 
don't know/care about Foo specifically, but do care about IList<T>?

        csharp> typeof(FooCollection).BaseType.GetInterfaces().Any(i => i == 
typeof(IList<>));
        false

Oops.

So now the developer needs to know & care, and behave accordingly:

        csharp> typeof(FooCollection).BaseType.GetInterfaces().Any(i => 
i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IList<>));
        true

 - Jon

_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to