我以为我已经看到了这一切,但是...... :)
我正在研究字符串类型的通用图表,
Graph<string> graph = new Graph<string>();
使用类约束声明图形:
public class Graph<T> where T : class
接下来,我用一些动态生成的字符串填充图表:
for (char t = 'A'; t < 'J'; t++)
{
GraphPrim.Add(t.ToString());
}
到目前为止一切顺利,(Node是一个包含原始值的内部类和一个对其他节点的引用列表(因为它是一个图))
现在,当我尝试在不同节点之间创建关系时,我必须通过检查它的值来查找正确的节点,这就是奇怪的开始。
以下代码是在进行一些测试后在immidiate窗口中找到的结果的直接副本:
Nodes.First().Value
"A"
Nodes.First().Value == "A"
false
Nodes.First().Value.ToString() == "A"
true
我完全错过了一些东西或者不应该是Nodes.First()。值==“A”使用字符串比较方法。 (JIT编译器知道运行时使用的类型,以及它支持的方法,对吧?)。在我看来,当没有明确指定字符串时,它会进行引用检查而不是字符串测试。
如果有人可以向我解释,那就太好了,
提前致谢!
答案 0 :(得分:8)
如果预先未完全了解类型(即Value
仅称为T
,并且严格已知为字符串),请使用像:
object.Equals(Nodes.First().Value,"A")
当然,你可以施放,但在这种情况下你需要一个丑陋的双重演员((string)(object)
)。
如果您知道这两个对象的类型相同(即两个T
值),那么您可以使用:
EqualityComparer<T>.Default.Equals(x,y)
上述优势在于它避免了结构和支持提升Nullable<T>
运算符,IEquatable<T>
以及Equals
。
答案 1 :(得分:5)
如果您的节点的Value
属性为object
,则==
运算符位于
Nodes.First().Value == "A"
将通过引用进行比较,而不是比较字符串。
答案 2 :(得分:3)
==
是静态方法,因此不是虚拟方法。选择使用哪个==
方法是在编译时完成的,而不是在运行时完成的。根据对象的编译时类型,可能会为通过引用进行比较的对象选择==
的实现。
如果您使用虚拟Equals
方法,这将按预期工作。