C# – 为什么我不能将using语句中声明的类作为引用类型传递?

假设我有以下一次性类和示例代码来运行它:

public class DisposableInt : IDisposable { private int? _Value; public int? MyInt { get { return _Value; } set { _Value = value; } } public DisposableInt(int InitialValue) { _Value = InitialValue; } public void Dispose() { _Value = null; } } public class TestAnInt { private void AddOne(ref DisposableInt IntVal) { IntVal.MyInt++; } public void TestIt() { DisposableInt TheInt; using (TheInt = new DisposableInt(1)) { Console.WriteLine(String.Format("Int Value: {0}", TheInt.MyInt)); AddOne(ref TheInt); Console.WriteLine(String.Format("Int Value + 1: {0}", TheInt.MyInt)); } } } 

调用new TestAnInt().TestIt()运行得很好。 但是,如果我更改TestIt()以便在using语句中声明DisposableInt ,如下所示:

  public void TestIt() { // DisposableInt TheInt; using (DisposableInt TheInt = new DisposableInt(1)) { Console.WriteLine(String.Format("Int Value: {0}", TheInt.MyInt)); AddOne(ref TheInt); Console.WriteLine(String.Format("Int Value + 1: {0}", TheInt.MyInt)); } } 

我收到以下编译器错误:

 Cannot pass 'TheInt' as a ref or out argument because it is a 'using variable' 

为什么是这样? 什么是不同的,除了类超出范围和一旦using语句完成后的垃圾收集器?

(是的,我知道我的一次性课程实例非常愚蠢,我只是想让事情变得简单)

为什么是这样?

using语句中声明的变量是只读的; outref参数不是。 所以你可以这样做:

 DisposableInt theInt = new DisposableInt(1); using (theInt) { AddOne(ref theInt); } 

…但从根本上说,你并没有使用它无论如何都是ref参数的事实……

你可能误解了ref真正含义。 阅读我关于参数传递的文章以确保您真正理解是一个好主意。