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

Pol*_*ity 7 c# generics

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

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

Graph<string> graph = new Graph<string>();
Run Code Online (Sandbox Code Playgroud)

使用类约束声明图形,如下所示:

public class Graph<T> where T : class
Run Code Online (Sandbox Code Playgroud)

接下来,我用一些动态生成的字符串填充图表:

for (char t = 'A'; t < 'J'; t++)
{
    GraphPrim.Add(t.ToString());
}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,(Node是一个内部类,包含原始值和一个对其他节点的引用列表(因为它是一个图))

现在,当我尝试在不同节点之间创建关系时,我必须通过检查其值以及怪异开始的位置来查找正确的节点.

以下代码是执行某些测试后在immidiate窗口中找到的结果的直接副本:

Nodes.First().Value
"A"
Nodes.First().Value == "A"
false
Nodes.First().Value.ToString() == "A"
true
Run Code Online (Sandbox Code Playgroud)

我完全缺少一些东西或不应该Nodes.First().值=="A"使用字符串比较方法.(JIT编译器知道运行时使用的类型,以及它支持的方法,对吧?).在我看来,当没有明确指定字符串时,它会进行引用检查而不是字符串测试.

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

提前致谢!

Mar*_*ell 8

如果预先不完全知道类型(即Value仅称为T并且严格地称为字符串),请使用以下内容:

object.Equals(Nodes.First().Value,"A")
Run Code Online (Sandbox Code Playgroud)

当然,你可以施放,但在这种情况下你需要一个(string)(object)丑陋的双重演员().

如果你知道这两个对象是相同的类型(即两个T值),那么你可以使用:

EqualityComparer<T>.Default.Equals(x,y)
Run Code Online (Sandbox Code Playgroud)

上述优点是它避免了结构和支撑提升Nullable<T>操作员的装箱,并且IEquatable<T>除此之外Equals.


Dyn*_*ard 5

如果Value您的节点的属性是object,==运营商在

Nodes.First().Value == "A"
Run Code Online (Sandbox Code Playgroud)

将通过引用进行比较,而不是比较字符串.


Mar*_*ers 3

==是静态方法,因此不是虚拟方法。选择==使用哪种方法是在编译时而不是运行时完成的。根据对象的编译时类型,它可能会选择==通过引用进行比较的对象的实现。

如果您改用虚拟Equals方法,这将按您的预期工作。