我以为我已经看到了这一切,但是...... :)
我正在研究字符串类型的通用图,
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编译器知道运行时使用的类型,以及它支持的方法,对吧?).在我看来,当没有明确指定字符串时,它会进行引用检查而不是字符串测试.
如果有人可以向我解释这一点,那就太好了,
提前致谢!
如果预先不完全知道类型(即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.
如果Value您的节点的属性是object,==运营商在
Nodes.First().Value == "A"
Run Code Online (Sandbox Code Playgroud)
将通过引用进行比较,而不是比较字符串.
==是静态方法,因此不是虚拟方法。选择==使用哪种方法是在编译时而不是运行时完成的。根据对象的编译时类型,它可能会选择==通过引用进行比较的对象的实现。
如果您改用虚拟Equals方法,这将按您的预期工作。
| 归档时间: |
|
| 查看次数: |
511 次 |
| 最近记录: |