Search code examples
c#foreachref

Alternative to using ref in foreach?


I have a modifying method with a signature like

private bool Modify(ref MyClass obj);

that will make modifications to obj and indicate succes with it's return value. Modify is not reassigning the reference (I know that this wouldn't work), just modifying instance fields, so I want to use it to do something like the following:

foreach(MyClass obj in myList)
{
    bool success = Modify(obj);
    // do things depending on success
}

I am running into a problem compiling as obj is "not being passed with the ref keyword". However, if I put the ref keyword in like so:

bool success = Modify(ref obj);

I get "cannot use obj as a ref/out because it is a 'foreach iteration variable". I understand that foreach uses an immutable iterator and that's why this doesn't work.

My question is what is the easiest alternative to make something like this work?

I have tried using

foreach(int i = 0; i < myList.Count; i++)
{
    bool success = Modify(ref myList[i]);
    // do things depending on success
}

but they I get "a property or indexer may not be passed as an out of ref parameter".

Thanks your help.


Solution

  • You state

    Modify is not reassigning the reference

    Therefore, there is no reason the Modify(ref MyClass) function needs to pass argument by ref.

    You should be able to do the same "modifications", whatever that is (please clarify that) by passing the object reference by value, i.e. removing the ref keyword.

    So, the fix here should be changing your Modify function signature from Modify(ref MyClass) to Modify(MyClass)