We need a boolean version because conditions can be of any type(see second example clause), and we need delegate version because you might need to use the exception object. That means we need 4 versions: CommonType+lazy, bool+lazy, CommonType+delegate and bool+delegate.