I don't have VS2010 with me at the moment but I was wondering, in C# 4.0

Given:

class Message { }
class BuildComplete : Message { }
interface IHandle<T> where T : Message { }

I know in C# 3.0 that if I have a collection of objects and some of them
implement the handler interface I can use the following line to give me a
strongly typed collection of handlers
IList<object> collection = ...
IList<IHandle<BuildComplete>> handlers =
collection.OfType<IHandle<BuildComplete>>().ToList();

Now, with the co/contra crazy going on in C# 4.0 (I can never remember which
is supposed to be which) if I add a couple of new message classes:

class BuildFailed : BuildComplete { }
class BuildSucceeded : BuildComplete { }

will the following line get me handlers of JUST BuildFailed or will handlers
of BuildComplete be in my collection as well?

IList<IHandle<BuildFailed>> handlers =
collection.OfType<IHandle<BuildFailed>>().ToList();

I'm guessing that it will but only if I adjust my handler interface to be
covariant
interface IHandle<in T> where T : Message { }

Can someone with VS2010 confirm?

-- 
Michael M. Minutillo
Indiscriminate Information Sponge
Blog: http://wolfbyte-net.blogspot.com

Reply via email to