C#/.NET will use tail recursion in a particular set of circumstances. (The C# compiler doesn't emit a tailcall opcode, but the JIT will implement tail recursion in some cases.
Shri Borde also has a post on this topic. Of course, the CLR is continually changing, and with .NET 3.5 and 3.5SP1 it may have changed again with respect to tail calls.