public virtual bool TryAcquireUpgradeableReadLock(TimeSpan timeout, out IUpgradeableReadLockAcquisition upgradeableReadLockAcquisition)
        {
            if (InternalLock.RecursionPolicy == LockRecursionPolicy.NoRecursion &&
                (InternalLock.IsReadLockHeld || InternalLock.IsUpgradeableReadLockHeld || InternalLock.IsWriteLockHeld))
            {
                upgradeableReadLockAcquisition = null;
                return false;
            }

            if (InternalLock.RecursionPolicy == LockRecursionPolicy.SupportsRecursion &&
                !(InternalLock.IsUpgradeableReadLockHeld || InternalLock.IsWriteLockHeld))
            {
                upgradeableReadLockAcquisition = null;
                return false;
            }

            IDisposable disposables = (IDisposable)null;

            var ok = TryLockChildren(LockTypes.UpgradeableRead, timeout, out disposables);

            if (ok)
            {
                ok = InternalLock.TryEnterUpgradeableReadLock(timeout);

                if (ok)
                {
                    upgradeableReadLockAcquisition = new UpgradeableReadLockAcquisition(owner: this, disposeWhenDone: disposables);
                    return true;
                }
                else
                {
                    disposables?.Dispose();
                }
            }

            upgradeableReadLockAcquisition = null;
            return false;
        }
        public bool TryAcquireUpgradeableReadLock(TimeSpan timeout, out IUpgradeableReadLockAcquisition upgradeableReadLockAcquisition)
        {
            if (InternalLock.RecursionPolicy == LockRecursionPolicy.NoRecursion &&
                (InternalLock.IsReadLockHeld || InternalLock.IsUpgradeableReadLockHeld || InternalLock.IsWriteLockHeld))
            {
                upgradeableReadLockAcquisition = null;
                return false;
            }

            if (InternalLock.RecursionPolicy == LockRecursionPolicy.SupportsRecursion &&
                !(InternalLock.IsUpgradeableReadLockHeld || InternalLock.IsWriteLockHeld))
            {
                upgradeableReadLockAcquisition = null;
                return false;
            }

            if(InternalLock.TryEnterUpgradeableReadLock(timeout))
            {
                upgradeableReadLockAcquisition = new UpgradeableReadLockAcquisition(owner: this);
                return true;
            }
            else
            {
                upgradeableReadLockAcquisition = null;
                return false;
            }
        }