I'm disappointed Mark does not expand his point of view and tries to sell his book instead. Anyway it looks like his comment is based on dependency injection / IOC. But dependency injection is not for every classes and every in every scenario.

The parameterless constructor constraint was an obvious need to avoid relying on reflection when building new instances. The same goes for this proposition. I don't think we want to rely on a IOC container to construct everyone of our types. And this suggestion is not bound/limited to IOC/DI.

Adding that kind of feature would allow more scenarios. (I know we can currently circumvent this with an interface constraint and an Initialize(parameters) method).

FWIW, I think this isn't a good idea, because it leads to increased coupling.

While you could argue that it would only make sense, since C# already has the 'where T : new()' constraint, I would rather argue that the 'new()' constraint never should have been added in the first place. However, now it's too late to remove it, but there's no reason to make things worse.

For more details, see the section about the Constrained Construction anti-pattern in my book: http://amzn.to/12p90MG

@giuseppe-lippolis I think you're confused; you can already do this with the current type system. Leaving your interface definition as it is, your class signature should be
public class SelectableCollection<TItem, TValue> : ICollection<TItem> where TItem : ISelectableItem<TValue>

... and please regard visibility. Currently, new constraint is always assumed as public. It suffices if the method which calls "Invoke" has sufficient access to the constructor. This is very useful for a factory pattern, where I don't want to expose the constructor.

I like this. Here is yet another suggestion on the same line...
as far as I'm aware, you can't do the following:

public void DoSomething<T>() where T : Nullable
OR
public void DoSomething<T>() where T : NOT(Nullable)

or somehow specify that T can (or cannot) be null. Recently I wanted to allow an "int?", or "long?" or "double?" (etc.) but not an "int", "long", or "double" but couldn't figure out how to do this. You CAN do this: