Doing functional programming in C# is technically possible (well, any language that has function pointers or delegates equivalent can be "functional") -- but C# gets very very painful if you try to do much.
Off the top of my head, in no particular order:
- Type inference
- Only exists for locals now
- Should apply to pretty much everything
- The #1 problem I have with C# is this. Particularly when you declare a local function... Func<...> = ouch.
- Full first class functions
- Delegates aren't the answer, since they aren't structually equivalent. There's no canonical type to represent a function of a certain type. Ex: What is "increment"? Is it a Func? Is it a Converter? Is it something else? This in turn makes inference more complicated.
- Automatic generalization
- Sucks to have to calculate and specify all the generic type parameters and their constraints
- Better support for immutability
- Make it trivial to declare simple data types
- Copy-with-modify type stuff (var x = oldX { SomeField = newVal })
- Tuples C# 7
- Discriminated unions (sum types)
- Pattern matching C# 7
- Makes tuples and sum types much more valuable
- Allows more expression-oriented code
- General monad syntax
- Makes things like async code much easier to write C# 5
- After you've nested 2+ layers of BeginXXX/EndXXX, it gets quite ugly.
- Easy syntax for function blocks, so you don't end up with closing lines like "});});"
Edit: One more:
Items in bold have been addressed since this answer was written.