使用"using"语法时流关闭错误

1 .net c# exception stream

我将在下面留下我原来的问题.我的问题是为什么以下行产生异常

(你可以在http://www.ideone.com/rfQLE上看到它运行)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace CSQuick
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var ff = new MemoryStream())
            using (var f = new StreamWriter(ff))
            {
                f.WriteLine("Hi");
                using (TextReader ts = new StreamReader(ff))
                {
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

来自ideone网站的例外(可能使用mono?我正在运行MSVS 2010 C#导致异常)

Unhandled Exception: System.ObjectDisposedException: The object was used after being disposed.
  at System.IO.MemoryStream.CheckIfClosedThrowDisposed () [0x00000] in <filename unknown>:0 
  at System.IO.MemoryStream.Write (System.Byte[] buffer, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0 
  at System.IO.StreamWriter.FlushBytes () [0x00000] in <filename unknown>:0 
  at System.IO.StreamWriter.Flush () [0x00000] in <filename unknown>:0 
  at System.IO.StreamWriter.Dispose (Boolean disposing) [0x00000] in <filename unknown>:0 
Run Code Online (Sandbox Code Playgroud)

为什么我的msg"无法访问已关闭的流"会出现异常.?我想做的是使用一个streamwriter来编写文本并将最终结果存储在temp中.下面应该这样做,但我不明白我的流是如何或为什么关闭?

using (var ff = new MemoryStream())
using (var f = new StreamWriter(ff))
{
    foreach (var t in blah)
    {
        blahblah(t, f);
    }
    ff.Flush()
    using (TextReader ts = new StreamReader(ff))
    {
        temp = ts.ReadToEnd();
        do_a_check(fn, temp);
    }
}//Cannot access a closed Stream.
Run Code Online (Sandbox Code Playgroud)

zav*_*vaz 5

您没有提供太多信息,但我认为错误是因为当StreamWriter using子句完成并且StreamWriter关闭时,底层流也会关闭.在这种情况下,当您尝试在using语句后访问流时您将收到错误"无法访问已关闭的流"

using (var ff = new MemoryStream())
{
using (var f = new StreamWriter(ff))
{
//Some Code
}
//Stream ff is closed, because the StreamWriter has been closed while exiting the inner using statement
}
Run Code Online (Sandbox Code Playgroud)