25

First time question for me :)

I need some way to define a default predicate using a generic on the format

Func<T, bool> 

and then use this as a default argument. Something like this:

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate = (T t) => true) 

When i do this i get the compile error:

Default parameter value for 'predicate' must be a compile-time constant

Is there a smooth way of doing this that I am missing or should a make the predicate function nullable and change my function logic accordingly?

Thanks,

3 Answers 3

35

Default values for method parameters have to be compile-time constants, as the default values are actually copied to all the call sites of the method by the compiler.

You have to use an overload to do this:

public bool Broadcast(byte command, MemoryStream data, bool async) { return Broadcast(command, data, async, t => true); } public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate) { // ... } 

Also, there is a specific Predicate<T> delegate in mscorlib which you can use instead. It's the same signature as Func<T, bool>, but it explicitly marks it as a delegate which decides whether an action is performed on instances of T

Sign up to request clarification or add additional context in comments.

1 Comment

I´m going with this for the extra information provided about the Predicate<T>
3

Make an overload for Broadcast which does not take the last argument.

Comments

2

Try this:

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate = default(Func<T, bool>)) 

But I think you have to check for predicate!=null.

1 Comment

In this case i might as well just do public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate = null)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.