h bob
h bob

Reputation: 3780

Optional arguments in a generic Func<>

I have the following method in an assembly:

public string dostuff(string foo, object bar = null) { /* ... */ }

I use it as a callback, so a reference to it is passed to another assembly as such:

Func<string, object, string> dostuff

Now in the original form, I can call it without specifying that second argument, which defaults to null. But when I use it as a callback in that second assembly, I must specify that second argument.

What syntax allows me to ignore that second argument?

Upvotes: 22

Views: 18350

Answers (2)

Selman Gen&#231;
Selman Gen&#231;

Reputation: 101701

You can't do this, simply because optional arguments are syntactic sugars and can be only used if you are calling the method directly. When you call the method like this:

dostuff(foo);

Compiler translates it into:

dostuff(foo, null);

In other cases such as using a delegate that doesn't accept an optional argument or when calling this method using reflection, you have to provide the optional argument.

Upvotes: 4

Servy
Servy

Reputation: 203835

You'll need to create a new method that accepts only one argument, and that passes the default value for the second argument. You could do this with a lambda, rather than creating a new named method, if you wanted:

Func<string, string> doStuffDelegate = s => dostuff(s);

The other option would be to use a delegate who's signature has an optional second argument, instead of using Func, in which case your method's signature would match:

public delegate string Foo(string foo, object bar = null);

You could assign dostuff to a delegate of type Foo directly, and you would be able to specify only a single parameter when invoking that delegate.

Upvotes: 21

Related Questions