Just ran into this today
An anonymous function or method group cannot be used as a constituent value of a dynamically bound operation.
when trying to do
static R ifNotNull<R>(dynamic o, Func<dynamic, R> returnFunc, R otherwise) {
return ReferenceEquals(null, o) ? otherwise : returnFunc(o);
}
and use it with
dynamic firstAddress = ...;
return ifNotNull<string>(firstAddress, (a) => a.address_1, null)
Now most of the limitations on dynamics make sense to me - you can't use an extension method because how is the compiler supposed to decide which static to compile it to? But I don't get this here. Where does the confusion come in? What exactly is the limitation?
I meant that you need to cast the
lambda
method to the expect expression you want. Then it'll work just fine.Like this:
What is the static type of the lamba
a => a.address_1
? You may be tempted to say it's aFunc<dynamic, dynamic>
. But remember:So maybe it's an
Expression<Func<dynamic, dynamic>>
. A lamda by itself doesn't have a single static type.Now normally type inference would figure out that you're passing the lamba to a function that takes a
Func
and it will be converted to a delegate at compile time. However when you are calling with dynamic arguments the method call is dispatched dynamically.So the fact that your method takes a
Func
isn't take into account, since the actual method call isn't determined until runtime so there is no type inference.To get this to compile you'll have to cast your lamba to a
Func<dynamic, string>
as below:Now the static type of your lamda is known.