You just wrote an answer.
If you are in .net 4.0 or higher, you can specify the variance for the parameters.
public delegate TV MyFunc<in T, TU, out TV>(T input, out TU output);
Then use:
bool TryGetItem(string itemKey,out Item item); MyFunc<string, Item, bool> func = TryGetItem;
source share