The name 'sr' doesn't exist in current context

c#, compiler-errors, scope, try-catch

Solution

I'm only adding this answer because the existing ones (while properly upvoted) just tell you what the error is, not WHY it's an error.

Doing this;

using (StreamReader sr = new StreamReader("TestFile.txt"));
{
     String line = sr.ReadToEnd();
     Console.WriteLine(line);
}

is actually the same (semantically) as doing this:

using (StreamReader sr = new StreamReader("TestFile.txt"))
{
    // Note that we're not doing anything in here
}
{
     String line = sr.ReadToEnd();
     Console.WriteLine(line);
}

The second block (created by the second set of curly braces) doesn't have anything to do with the `using` block. Since a variable defined within a `using` block is only in scope within that block, it doesn't exist (in terms of being in scope and accessible) once your code reaches the second block.

You should use the `using` statement because `StreamReader` implements `IDisposable`. The `using` block provides a simple, clean way to ensure that--even in the case of an exception--your resources are properly cleaned up. For more information on the `using` block (and, specifically, what the `IDisposable` interface is), see the meta description on the `IDisposable` tag.

Problem

I was following example from microsoft site for reading from text file. They say to do it like this: ``` class Test { public static void Main() { try { using (StreamReader sr = new StreamReader("TestFile.txt")); { String line = sr.ReadToEnd(); Console.WriteLine(line); } } catch (Exception e) { Console.WriteLine("The file could not be read:"); Console.WriteLine(e.Message); } } } ``` but when I do it like that in Visual C# 2010 it brings me errors: Possible mistaken empty statement The name 'sr' does not exist in current context I removed the `using` part and now the code looks like this and is working: ``` try { StreamReader sr = new StreamReader("TestFile.txt"); string line = sr.ReadToEnd(); Console.WriteLine(line); } ``` Why is that? Update: there was semicolon at the end of `using(....);`

Original source