C#Generics,比较2个字符串失败,除非明确指定

时间:2010-01-20 20:54:17

标签: c# generics

我以为我已经看到了这一切,但是...... :)

我正在研究字符串类型的通用图表,

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编译器知道运行时使用的类型,以及它支持的方法,对吧?)。在我看来,当没有明确指定字符串时,它会进行引用检查而不是字符串测试。

如果有人可以向我解释,那就太好了,

提前致谢!

3 个答案:

答案 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方法,这将按预期工作。