为什么在Equals方法中忽略了Uri的片段?

Adr*_*ian 5 c# uri

我正在尝试根据URI来维护对象集合:

public class ConceptCollection : KeyedCollection<Uri, Concept> {
    protected override Uri GetKeyForItem(Concept item) {
        return item.Uri;
    } 
}
Run Code Online (Sandbox Code Playgroud)

但是,URI通常仅根据Uri的片段而不同.因此,以下会导致错误:

ConceptCollection wines = new ConceptCollection();
Concept red = new Concept("http://www.w3.org/2002/07/owl#RedWine");
Concept white = new Concept("http://www.w3.org/2002/07/owl#WhiteWine");
wines.Add(red);
wines.Add(white); // Error: An item with the same key has already been added.
Run Code Online (Sandbox Code Playgroud)

根据http://msdn.microsoft.com/en-us/library/f83xtf15.aspx:

Equals方法比较两个实例,而不考虑它们可能包含的用户信息(UserInfo)和片段(Fragment)部分.例如,给定URI http://www.contoso.com/index.htm#searchhttp:// user:password@ www.contoso.com/ index.htm,Equals方法将返回true.

我已经辞职了,不得不破解这个.但为什么它会这样呢?我可以看到用户信息的逻辑,但不能看到片段.

Sco*_*man 9

来自RFC 2396:

4.1.片段标识符

当URI引用用于对所标识的资源执行检索操作时,通过交叉线("#")字符与URI分离的可选片段标识符包括在检索之后由用户代理解释的附加参考信息.行动已成功完成. 因此,它不是URI的一部分,但通常与URI结合使用.

增加的重点是我的,并且是在Uri.Equals实现中不考虑片段的原因.

在您的示例中,您要检索的资源的URI是:http://www.w3.org/2002/07/owl

片段由用户代理处理,对资源的实际检索没有意义或影响.