Re: "the ability to use operators on generic types."
This argument sounds more like a criticism of variant or dynamic than of generics....
Generics are strongly typed, if you define a List<int> then you can do list operations on the list and int operations on the items in it. it's quite handy and lets you do some powerful stuff. ideally you encapsulate generics in something else, so if you want a ListOfShapes, you can inherit from List<Shape> and add the relevant methods for dealing with a list of shapes, and the consumers only see Shapes come out of it.
The generic math stuff would have helped massively with something i had to implement a couple of years ago, which dealt with AmountOfMoney types, which contain an amount and a currency.
You can only do certain operations on an amount of money if the currency matches, 1 USD+ 1USD = 2 USD, but 1 USD + 1 GBP is an error...
or you can add a decorator that can convert the currency, so 1 USD + (new ConvertedCurrency(1 GBP, conversionratetodollars)) = 2.14 USD (where converted currency also implements amountofmoney)
The problem arises when you have an empty amount of money; null +1 USD = an null ref.
a NullableAmountOfMoney + 1 USD involves a lot of null and value checking
a Maybe<AmountOfMoney> involves the same sort of checking
but a MaybeMoney<AmountOfMoney> that implements the relevant maths operations for money and handled null + 1 USD = 1 USD would have made several hours of explaining to my team why i'd implemented a bunch of weird looking code to make AmountOfMoney + AmountOfMoney work correctly go away.
(it didn't help that the underlying AmountOfMoney allowed AmountOfMoney * AmountOfMoney but not AmountOfMoney * int, (and also division... money divide money = what? although money / 3 = a new amount of money with the same currecny and the amount / 3, or, a list of 3 amounts of money where the three amounts add up to the original total, all taking into account that currencies have between 0 and 3 decimal places and a third of a cent isn;t valid...)