Во-первых, код я бы переписал так:
private class ThreadsafeMemoizeCache<TArgument, TResult>
{
private readonly Dictionary<TArgument, TResult> _internalCache = new Dictionary<TArgument, TResult>();
private readonly object _internalCacheLocker = new object();
public TResult GetOrAdd(TArgument key, Func<TArgument, TResult> valueFactory)
{
lock (_internalCacheLocker)
{
TResult result;
if (_internalCache.TryGetValue(key, out result))
return result;
result = valueFactory(key);
_internalCache.Add(key, result);
return result;;
}
}
}
А во-вторых, у меня вот такой код работает:
var cache = new ThreadsafeMemoizeCache<string, string>();
cache.GetOrAdd("1", (arg) => string.Empty);
cache.GetOrAdd("1", (arg) => string.Empty);