«универсальный, где T: IComparable» означает, что T может быть только производным от IComparable.Поэтому, когда пользователь универсального класса пытается использовать для T тип, который не является IComparable, компилятор будет жаловаться.
Что касается первой части вопроса, я должен признать, что я не знаю.Может быть, такой инструмент, как Re-Sharper или CodeRush, может помочь.