Как я представляю URN (Uniform Resource Names) в.NET, чтобы Equals работал как ожидалось

RFC2141 упоминает:

  1. Примеры лексической эквивалентности

    Следующие сравнения URN подчеркивают лексическую эквивалентность
    определения:

       1- URN:foo:a123,456
       2- urn:foo:a123,456
       3- urn:FOO:a123,456
       4- urn:foo:A123,456
       5- urn:foo:a123%2C456
       6- URN:FOO:a123%2c456
    

    URNs 1, 2 и 3 все лексически эквивалентны.

Последующий RFC8141 сохраняет эту эквивалентность:

2.1. Идентификатор пространства имен (NID)

NID нечувствительны к регистру (например, "ISBN" и "isbn" эквивалентны).

Ближайшим представлением для URN, которое я могу легко найти в платформе.NET, является URI-класс. Однако, похоже, он не полностью соблюдает определение эквивалентности RFC:

    [TestMethod]
    public void TestEquivalentUrnsAreBroken()
    {
        Assert.AreEqual(
            new Uri("URN:foo:a123,456"),
            new Uri("urn:foo:a123,456"));

        Assert.AreEqual(
            new Uri("urn:foo:a123,456"),
            new Uri("urn:FOO:a123,456"));
    }

В приведенном выше примере кода первое утверждение работает как ожидалось, тогда как второе утверждение терпит неудачу.

Есть ли разумный способ заставить класс URI уважать определение эквивалентности? Есть ли другой класс, который я должен использовать вместо этого?

Обратите внимание, что я нашел класс URN, но в документации упоминается, что он не должен использоваться напрямую.

+1
источник поделиться

Посмотрите другие вопросы по меткам или Задайте вопрос