public bool TryAcquireWriteLock(TimeSpan timeout, out IWriteLockAcquisition writeLockAcquisition)
            {
                if (Owner.InternalLock.RecursionPolicy == LockRecursionPolicy.NoRecursion && 
                    (Owner.InternalLock.IsReadLockHeld || Owner.InternalLock.IsUpgradeableReadLockHeld || Owner.InternalLock.IsWriteLockHeld))
                {
                    writeLockAcquisition = null;
                    return false;
                }

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

                var ok = Owner.InternalLock.TryEnterWriteLock(timeout);

                writeLockAcquisition = new WriteLockAcquisition(Owner);
                return true;
            }
            public bool TryAcquireWriteLock(TimeSpan timeout, out IWriteLockAcquisition writeLockAcquisition)
            {
                if (Owner.InternalLock.RecursionPolicy == LockRecursionPolicy.NoRecursion &&
                    (Owner.InternalLock.IsReadLockHeld || Owner.InternalLock.IsUpgradeableReadLockHeld || Owner.InternalLock.IsWriteLockHeld))
                {
                    writeLockAcquisition = null;
                    return false;
                }

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

                var disposables = (IDisposable)null;
                var ok = Owner.TryLockChildren(LockTypes.Write, timeout, out disposables);

                if (ok)
                {
                    ok = Owner.InternalLock.TryEnterWriteLock(timeout);

                    if (ok)
                    {
                        writeLockAcquisition = new WriteLockAcquisition(Owner, disposables);
                        return true;
                    }
                    else
                    {
                        disposables?.Dispose();
                    }
                }

                writeLockAcquisition = null;
                return false;
            }
        public bool TryAcquireWriteLock(TimeSpan timeout, out IWriteLockAcquisition writeableLockAcquisition)
        {
            if (InternalLock.RecursionPolicy == LockRecursionPolicy.NoRecursion &&
                (InternalLock.IsReadLockHeld || InternalLock.IsUpgradeableReadLockHeld || InternalLock.IsWriteLockHeld))
            {
                writeableLockAcquisition = null;
                return false;
            }

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

            if (InternalLock.TryEnterWriteLock(timeout))
            {
                writeableLockAcquisition = new WriteLockAcquisition(owner: this);
                return true;
            }
            else
            {
                writeableLockAcquisition = null;
                return false;
            }
        }