Доступ к свойству, индексатору или динамическому члену нельзя передавать как параметр out или ref со свойством readonly. - PullRequest
2 голосов
/ 27 июня 2011

Я знаю, что есть много вопросов об этой ошибке, но я не нашел никого, кто бы решал этот сценарий:

У меня есть свойство только для чтения, и внутри метода я хочу его использовать (не назначать), поэтому решение ошибки не может быть типичным:

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

Поскольку этот код не компилируется, например, MyProp доступен только для чтения и не может быть назначен.

В основном я хочу написать свойство Stream 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 ]

4 голосов
/ 27 июня 2011

Вы должны изменить параметр на нормальный параметр.

Вам (вероятно) все равно не нужен параметр ref.

Подробнее о передаче по ссылке см. здесь .


Если вам действительно нужен параметр ref, вы можете поместить объект в локальную переменную с возможностью записи и передать эту переменную как ref.
Однако это уничтожит всю цель параметра.

2 голосов
/ 27 июня 2011

вам не нужно указывать этот ссылочный параметр, чтобы делать то, что вы хотите.просто передайте поток и напишите в него.

Он жалуется, потому что вы используете параметр 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, который не будет разрешен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...