Home > Mobile >  Cannot convert method group to Action
Cannot convert method group to Action

Time:04-23

I am stuck with this error but not sure how to fix it.

I am trying to pass a method as a parameter to another function as an action. I have an interface which defines two methods:

//ISegment interface
void SetNodeA(in INode node);
void SetNodeB(in INode node);

Next I create a segment and I want to pass this method into another function:

ISegment segment = GetSegment();
Execute(start, segment.SetNodeA);
Execute(end, segment.SetNodeB);

My execute function looks like this:

void Execute(in EndPoint point, in Action<INode> fnc)
{
    Verify(segment);
    Verify(point.Node);
    fnc?.Invoke(point.Node); //set the node
}

Problem is i get this error:

Argument 2: cannot convert from 'method group' to 'in Action'

Not sure what it means by method group here or how to fix it.

CodePudding user response:

The problem is that your SetNodeA and SetNodeB methods have an in parameter and you're trying to invoke them via an Action<T>, which does not support in, out, or ref parameters.

If you need to keep using in for those methods, then you can achieve that by creating a custom delegate type and use that instead of Action<T>:

public delegate void ActionWithInParam<T>(in T node);

Then, your Execute method would be something like this:

void Execute(in EndPoint point, ActionWithInParam<INode> fnc)
{
    Verify(segment);
    Verify(point.Node);
    fnc?.Invoke(point.Node); //set the node
}

CodePudding user response:

You need either remove in parameter modifier from SetNodeX signature or use custom delegate for second Execute parameter:

public interface ISegment
{
    void SetNodeA(in INode node);
    void SetNodeB(INode node); // in removed
}

public delegate void DelegateWithIn(in INode node);

void Execute(in EndPoint point, DelegateWithIn fnc)
{
}
void Execute1(in EndPoint point, Action<INode> fnc)
{
}

Execute(null, segment.SetNodeA); // uses custom delegate
Execute1(null, segment.SetNodeB); // uses Action

As I mentioned in the comments Action and Func delegates does not support in, out and ref parameter modifiers.

  •  Tags:  
  • c#
  • Related