gpt4 book ai didi

c# - TypeDelegator 平等不一致?

转载 作者:IT王子 更新时间:2023-10-29 04:31:23 26 4
gpt4 key购买 nike

考虑以下代码:

    class MyType : TypeDelegator
{
public MyType(Type parent)
: base(parent)
{
}
}

class Program
{
static void Main(string[] args)
{
Type t1 = typeof(string);
Type t2 = new MyType(typeof(string));

Console.WriteLine(EqualityComparer<Type>.Default.Equals(t1, t2)); // <-- false
Console.WriteLine(EqualityComparer<Type>.Default.Equals(t2, t1)); // <-- true

Console.WriteLine(t1.Equals(t2)); // <-- true
Console.WriteLine(t2.Equals(t1)); // <-- true

Console.WriteLine(Object.Equals(t1, t2)); // <-- false
Console.WriteLine(Object.Equals(t2, t1)); // <-- true
}
}

为什么不同版本的 Equals 返回不同的结果? EqualityComparer.Default 可能调用 Object.Equals,因此这些结果匹配,尽管它们本身不一致。 Equals 的普通实例版本都返回 true

当方法返回实际上继承自 TypeDelegatorType 时,这显然会产生问题。想象一下,例如将这些类型作为键放在字典中,默认情况下使用 EqualityComparer.Default 进行比较。

有什么办法可以解决这个问题吗?我希望上面代码中的所有方法都返回 true

最佳答案

以下代码返回一个 System.RuntimeType

Type t1 = typeof(string);

如果您查看 Type 的代码,则有:

public override bool Equals(Object o)
{
if (o == null)
return false;

return Equals(o as Type);
}

但是,System.RuntimeType 有:

public override bool Equals(object obj) 
{
// ComObjects are identified by the instance of the Type object and not the TypeHandle.
return obj == (object)this;
}

如果您查看程序集,它会执行:cmp rdx、rcx,所以只是直接内存比较。

您可以使用以下方法重现它:

bool a = t1.Equals((object)t2); // False
bool b = t1.Equals(t2); // True

所以看起来 RuntimeType 正在覆盖 Type Equals 方法来进行直接比较......看起来没有简单的方法解决这个问题(不提供比较器)。

编辑添加:出于好奇,我查看了 RuntimeType 的 .NET 1.0 和 1.1 实现。它们没有覆盖 RuntimeType 中的 Equals,因此该问题是在 .NET 2.0 中引入的。

关于c# - TypeDelegator 平等不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7633260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com