dotnet/wpf · error · ArgumentException

SR.TextRangeProvider_InvalidRangeProvider

Error message

SR.TextRangeProvider_InvalidRangeProvider

What it means

ArgumentException thrown by TextRangeProviderWrapper.Compare when the passed ITextRangeProvider was not created by the same WPF text pattern peer (i.e. it is not a TextRangeProviderWrapper), so the ranges cannot be meaningfully compared.

Solutions

  1. Obtain both ranges from the same text provider (clone the range with RangeFromChild/RangeFromPoint/DocumentRange instead of mixing providers)
  2. Before comparing, verify the range is a TextRangeProviderWrapper of the same peer
  3. Return false for ranges from foreign providers instead of letting the wrapper throw
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/Automation/TextRangeProviderWrapper.cs:50 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14). Data as JSON: /api/errors/33a160620cd9e556. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/Automation/TextRangeProviderWrapper.cs:50

        //------------------------------------------------------
        //
        //  Interface ITextRangeProvider
        //
        //------------------------------------------------------
 
        #region Interface ITextRangeProvider

        public ITextRangeProvider Clone()
        {
            return (ITextRangeProvider)ElementUtil.Invoke(_peer, new DispatcherOperationCallback(Clone), null);
        }

        public bool Compare(ITextRangeProvider range)
        {
            if (!(range is TextRangeProviderWrapper))
            {
                throw new ArgumentException(SR.Format(SR.TextRangeProvider_InvalidRangeProvider, "range"));
            }

            return (bool)ElementUtil.Invoke(_peer, new DispatcherOperationCallback(Compare), range);
        }

        public int CompareEndpoints(TextPatternRangeEndpoint endpoint, ITextRangeProvider targetRange, TextPatternRangeEndpoint targetEndpoint)
        {
            if (!(targetRange is TextRangeProviderWrapper))
            {
                throw new ArgumentException(SR.Format(SR.TextRangeProvider_InvalidRangeProvider, "targetRange"));
            }

            object[] args = new object[] { endpoint, targetRange, targetEndpoint };
            return (int)ElementUtil.Invoke(_peer, new DispatcherOperationCallback(CompareEndpoints), args);
        }

        public void ExpandToEnclosingUnit(TextUnit unit)
        {

View on GitHub (pinned to 81131a70a4)