dotnet/maui · warning · NotSupportedException
void ICollection<Element>.Clear() => throw new NotSupportedE
Error message
void ICollection<Element>.Clear() => throw new NotSupportedException();
What it means
Thrown by TemporaryWrapper.Clear(). TemporaryWrapper is the read-only IList<Element> adapter behind the obsolete Element.LogicalChildren ReadOnlyCollection. Because IsReadOnly is true and the inner IReadOnlyList cannot be cleared, Clear throws NotSupportedException.
Source
Thrown at src/Controls/src/Core/Element/Element.cs:1203
class TemporaryWrapper : IList<Element>
{
IReadOnlyList<Element> _inner;
public TemporaryWrapper(IReadOnlyList<Element> inner)
{
_inner = inner;
}
Element IList<Element>.this[int index] { get => _inner[index]; set => throw new NotSupportedException(); }
int ICollection<Element>.Count => _inner.Count;
bool ICollection<Element>.IsReadOnly => true;
void ICollection<Element>.Add(Element item) => throw new NotSupportedException();
void ICollection<Element>.Clear() => throw new NotSupportedException();
bool ICollection<Element>.Contains(Element item) => _inner.IndexOf(item) != -1;
void ICollection<Element>.CopyTo(Element[] array, int arrayIndex) => throw new NotSupportedException();
IEnumerator<Element> IEnumerable<Element>.GetEnumerator() => _inner.GetEnumerator();
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => _inner.GetEnumerator();
int IList<Element>.IndexOf(Element item) => _inner.IndexOf(item);
void IList<Element>.Insert(int index, Element item) => throw new NotSupportedException();
bool ICollection<Element>.Remove(Element item) => throw new NotSupportedException();
void IList<Element>.RemoveAt(int index) => throw new NotSupportedException();
}
}View on GitHub (pinned to f377ff1c5e)
Solutions
- Remove logical children individually via RemoveLogicalChild rather than clearing the collection.
- Treat LogicalChildren and its backing list as read-only.
- Avoid writing to internal Element collections.
Example fix
// before (reflection on internal wrapper)
wrapper.Clear(); // NotSupportedException
// after
foreach (var child in element.LogicalChildren.ToList())
element.RemoveLogicalChild(child); Defensive patterns
Strategy: validation
Validate before calling
if (element.LogicalChildren.IsReadOnly)
return; // do not Clear the backing wrapper Try / catch
// Adapter reached only via reflection; remove children individually via RemoveLogicalChild.
Prevention
- Remove children via RemoveLogicalChild in a loop instead of clearing the collection.
- Treat LogicalChildren as read-only.
- Do not manipulate internal collections via reflection.
When it happens
Trigger: Calling Clear on the internal TemporaryWrapper obtained via reflection or internal access. The public ReadOnlyCollection wrapper would block this first; reaching TemporaryWrapper.Clear requires accessing the adapter directly.
Common situations: Hot Reload or designer tooling attempting to reset logical children by clearing the backing collection; reflection-based code treating the wrapper as mutable.
Related errors
- Element IList<Element>.this[int index] { get => _inner[index
- void ICollection<Element>.Add(Element item) => throw new Not
- void ICollection<Element>.CopyTo(Element[] array, int arrayI
- void IList<Element>.Insert(int index, Element item) => throw
- bool ICollection<Element>.Remove(Element item) => throw new
AI-assisted analysis of dotnet/maui@f377ff1c5e (2026-08-13).
Data as JSON: /api/errors/661c29ceb0ef548f.
Report an issue: GitHub.