How do I use the C#6 "Using static" feature?

C#Visual Studio-2015StaticUsingC# 6.0

C# Problem Overview


I'm having a look at a couple of the new features in C# 6, specifically, "using static".

> using static is a new kind of using clause that lets you import static members of types directly into scope.
> (Bottom of the blog post)

The idea is as follows, according to a couple of tutorials I found,
Instead of:

using System;

class Program 
{ 
    static void Main() 
    { 
        Console.WriteLine("Hello world!"); 
        Console.WriteLine("Another message"); 
    } 
}

You can omit the repeated Console statement, using the new C# 6 feature of using static classes:

using System.Console;
//           ^ `.Console` added.
class Program 
{ 
    static void Main() 
    { 
        WriteLine("Hello world!"); 
        WriteLine("Another message"); 
    } // ^ `Console.` removed.
}

However, this doesn't appear to be working for me. I'm getting an error on the using statement, saying:

> "A 'using namespace' directive can only be applied to namespaces; 'Console' is a type not a namespace. Consider a 'using static' directive instead"

I'm using visual studio 2015, and I have the build language version set to "C# 6.0"

What gives? Is the msdn blog's example incorrect? Why doesn't this work?


The blog post has now been updated to reflect the latest updates, but here's a screenshot in case the blog goes down:

>blog

C# Solutions


Solution 1 - C#

It appears the syntax has slightly changed since those blog posts were written. As the error message suggests, add static to your include statement:

using static System.Console;
//      ^
class Program 
{ 
    static void Main() 
    { 
        WriteLine("Hello world!"); 
        WriteLine("Another message"); 
    } 
}

Then, your code will compile.


Note that, in C# 6.0, this will only work for members declared as static.

For example, consider System.Math:

public static class Math {
    public const double PI = 3.1415926535897931;
    public static double Abs(double value);
    // <more stuff>
}

When using static System.Math, you can just use Abs();.
However, you'd still have to prefix PI because it isn't a static member: Math.PI;.

Starting with C# version 7.2, this shouldn't be the case, const values like PI can be used as well.

Solution 2 - C#

The static Keyword on a using statement will import only the one, specified type (and it's nested types). Furthermore you must not give the type name anymore. So just add static to your using.

Note: Please use this feature only when the two classes are logically closely related, otherwise it makes reading the code pretty hard.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCerbrusView Question on Stackoverflow
Solution 1 - C#CerbrusView Answer on Stackoverflow
Solution 2 - C#Tobias BrohlView Answer on Stackoverflow