属性、索引器或动态成员访问不能作为具有只读属性的out或ref参数传递



我知道这个错误有很多问题,但我还没有找到解决这个问题的人:

我有一个只读属性,在一个方法中我想使用它(而不是分配它),所以错误的解决方案不能是典型的:

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

因为这些代码不会编译,比如MyProp是只读的,不能赋值。

基本上,我想要的是用这样的方法编写响应流属性:

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);
}

我该怎么做?

谢谢,Diego

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

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

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

有关通过引用传递的更多信息,请参阅此处。


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

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

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

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

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

并且将尝试将不被允许的新流对象分配给CCD_ 6。

最新更新