public IDisposable Use(T value)
        {
            ThreadStaticValue old;

            ThreadStatics.TryGetValue(this, out old);
            return(ThreadStatics[this] = new ThreadStaticValue(this, value, old));
        }
 private void DisposeScope(ThreadStaticValue valueToDispose)
 {
     if (Thread.CurrentThread.ManagedThreadId != valueToDispose.threadId)
     {
         throw new DisposingOnDifferentThreadToCreation();                 // ncrunch: no coverage
     }
     ThreadStatics.TryGetValue(this, out innerMost);
     while (innerMost != valueToDispose)
     {
         DisposeInnerMostScopes();
     }
     DisposeCurrentScope(valueToDispose);
 }