It depends on what you mean by "features". There are compile-time features like the var keyword and lambda expressions and there are run-time features like LINQ or WCF that require libraries in the .NET 3.x runtime.
I assume you're using Visual Studio 2008, which will handle all the compile-time features. If all you're using is the compile-time features, then everything will work fine in all cases. I do this rather often on my current project.
If you're using run-time features then I believe this is how it will shake out:
- Things will just work.
- I think this will just work also.
- It depends on when static functions are JITted and if you have any 3.5 library referencing code in static functions.
- Probably
MissingMethodException when a function containing a 3.5 library feature is called.
Rather than worry about all of this, if you're planning on using run-time features, I would simply add a key to the App.config that the 3.5 runtime is required and it'll check on startup and bomb if it isn't present. Then you don't need to figure out all these permutations and your application will be more stable.