Why Does .NET 4.6 Specific Code Compile When Targeting Older Versions of the Framework? [duplicate]
Asked Answered
C

2

10

I have a project that targets older versions of the .NET framework (.NET 4.5.2). I installed Visual Studio 2015 (and therefore .NET 4.6 on my machine). I noticed that if I use C# language features released in .NET 4.6/C# 6, it still compiles. If my project's target framework is < .NET 4.6, shouldn't this not compile:

    public string MyExpressionBodyProperty => "1";

    //auto properties are new in C# 6
    public string MyAutoProperty { get; } = "1";

    private static void MethodThatUsesNameOf(string filename)
    {
        if (filename == null) 
        {
            //nameof was released in C# 6
            throw new ArgumentException("The file does not exist.", nameof(filename));
        }
    }

How can I ensure I'm only using .NET language features that work with the framework version I'm targeting?

Casillas answered 22/7, 2015 at 17:59 Comment(0)
H
20

The .NET Framework version and the C# language version are different things. The C# 6 language features

public string MyAutoProperty { get; } = "1";
nameof(filename)

can be compiled by VS 2015 into code that targets earlier frameworks.

How can I ensure I'm only using .NET language features that work with the framework version I'm targeting?

If you try to use a .NET 4.6 Framework feature, you will get an appropriate compiler error if you are targeting an earlier framework.

Would I be able to deploy this code to machine which did not have .NET 4.6?

Yes, you would. As long as the deployment machine has a framework compatible with the one you target in VS2015.

Hilltop answered 22/7, 2015 at 18:2 Comment(1)
Another option is to change to C# version 5 under Project Properties - Build - Advanced.Kellerman
M
12

There are C# 6 features and .NET 4.6 features.

nameof is a C# 6 feature so only needs to be running on a newer compiler but can still use the older .NET framework.

An example of a feature that requires .NET 4.6 is the following:

public void Foo(IReadOnlyCollection<string> input)
{
}

public void Main(string[] args)
{
    Foo(new Stack<string>());
}

In .NET 4.6 Stack implements IReadOnlyCollection but in previous versions it does not. The above code would fail to compile if you selected .NET 4.5.2 as your target platform.

Montes answered 22/7, 2015 at 18:1 Comment(4)
Would I be able to deploy this code to machine which did not have .NET 4.6? I don't follow your last sentence "Typically classes are involved when talking about .NET framework features."Casillas
Yes, you would. As long as the deployment machine has a framework compatible with the one you target in VS2015.Hilltop
@whatevAR: I expanded my comment to a specific example of functionality. Here is a list of changes that are specific to the new version of .NET framework for more examples. If it isn't on that page it isn't something you need to worry about utilizing. Also the compiler can be trusted for determining whether a feature can be used or not.Montes
There are though language features that are in turn backed by framework features. You can't use async/await without IAsyncStateMachine, for example.Innoxious

© 2022 - 2024 — McMap. All rights reserved.