属性,索引器或动态成员访问不能作为带有readonly属性的out或ref参数传递

时间:2011-06-27 11:23:55

标签: c# .net asp.net-mvc-3

我知道有很多关于此错误的问题,但我没有找到任何解决此问题的人:

我有一个readonly属性,在一个方法里面我想用它(不分配它)所以错误的解决方案不是典型的:

var a = myOjb.MyProp;
DoSomething(a);
myObj.MyProp = a;

因为该代码无法编译,例如MyProp是只读的,无法分配。

基本上我想要的是在这样的方法中编写Response of Response属性:

public ActionResult Guardar()
{
    try
    {
        SomeMethod(ref Response.OutputStream);
        Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", name));
        Response.ContentType = "Application/pdf";
        return null;
    }
    catch { }
}

public void SomeMethod(ref Stream responseStream)
{
    responseStream.Write(new byte[] { 1, 2, 5, 3 }, 0, 4);
}

我该怎么做?

谢谢,迭戈

注意:代码只是一个例子。

2 个答案:

答案 0 :(得分:4)

您应该将参数更改为普通参数。

您(可能)无论如何都不需要ref参数。

有关按引用传递的详细信息,请参阅here


如果确实需要ref参数,可以将对象放在本地可写变量中,并将该变量作为ref传递。
但是,这将破坏参数的整个目的。

答案 1 :(得分:2)

您不需要将其作为参考参数来执行您想要的操作。只需传入流并写入即可。

它抱怨是因为您正在使用ref参数并传递Response.OutputStream,这意味着当您的方法返回时,可能会尝试将Response.OutputStream设置为来自的新流在方法内,这是不允许的。这并不意味着做,但它可能会。

例如,这在您的示例中有效(并且是编译器抱怨的原因):

public void SomeMethod(ref Stream responseStream)
{
    responseStream = new Stream();
    responseStream.Write(new byte[] { 1, 2, 5, 3 }, 0, 4);
}

并尝试将新的流对象分配给Response.OutputStream,这是不允许的。