190

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

0

2 Answers 2

262

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.

Sign up to request clarification or add additional context in comments.

15 Comments

I'm having a similar problem, but instead with System.Math, specifically Math.PI. When I use using static System.Math, methods like Sqrt() work but not a constant like PI. I have to continue writing Math.PI or the code doesn't compile. I'm curious as to why this doesn't work. Should I submit a new question for this?
@skwear: that sounds like material for a new question, yea.
As a quick answer to @skwear's question: "using static is a new kind of using clause that lets you import static members <...>". PI is not a static member of the Math class. It's a constant. Simply put: the member has to be declared as static.
Sounds like an opportunity for a new syntax like: using const System.Math; :)
The example in the Microsoft documentation claims PI can be used without prefix: learn.microsoft.com/en-us/dotnet/csharp/language-reference/…
|
8

The static Keyword on a using statement will import only the one, specified type (and its 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.

3 Comments

"you must not give the type name" What do you mean by that? Where did I do that?
Thobias, I'm not combining the two anywhere.
@Cerbrus Oh the context of the 'as you did' accidentally changed, will fix that

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.