To quote MSDN:
The .NET Framework 4 is backward-compatible with applications that
were built with the .NET Framework versions 1.1, 2.0, 3.0, and 3.5. In
other words, applications and components built with previous versions
of the .NET Framework will work on the .NET Framework 4.
However, in practice, this compatibility can be broken by seemingly
inconsequential changes in the .NET Framework and changes in
programming techniques. For example, performance improvements in the
.NET Framework 4 can expose a race condition that did not occur on
earlier versions. Similarly, using a hard-coded path to .NET Framework
assemblies, performing an equality comparison with a particular
version of the .NET Framework, and getting the value of a private
field by using reflection are not backward-compatible practices. In
addition, each version of the .NET Framework includes bug fixes and
security-related changes that can affect the compatibility of some
applications and components.
You should test your .NET Framework applications and components to
ensure that they are compatible with other versions of the .NET
Framework. To ensure that an application or component successfully
runs on the .NET Framework 4, use the .NET Framework 4 Application
You may also see this very useful thread wherein a detailed explanation was given:
What is .NET framework backward compatibility?A myth.