175

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

245

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.

15
  • 3
    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
    Commented Sep 22, 2016 at 20:05
  • 6
    @skwear: that sounds like material for a new question, yea.
    – Cerbrus
    Commented Sep 22, 2016 at 20:41
  • 2
    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.
    – Cerbrus
    Commented Apr 5, 2017 at 9:54
  • 3
    Sounds like an opportunity for a new syntax like: using const System.Math; :) Commented Nov 17, 2017 at 0:05
  • 1
    The example in the Microsoft documentation claims PI can be used without prefix: learn.microsoft.com/en-us/dotnet/csharp/language-reference/… Commented Aug 7, 2018 at 23:35
5

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.

3
  • "you must not give the type name" What do you mean by that? Where did I do that?
    – Cerbrus
    Commented Aug 9, 2018 at 11:45
  • Thobias, I'm not combining the two anywhere.
    – Cerbrus
    Commented Aug 9, 2018 at 11:49
  • @Cerbrus Oh the context of the 'as you did' accidentally changed, will fix that Commented Aug 9, 2018 at 11:51

Not the answer you're looking for? Browse other questions tagged or ask your own question.