C#泛型,比较2个字符串失败,除非明确指定
我以为我已经看到了一切,除了这个……:) 我在做一个字符串类型的通用图C#泛型,比较2个字符串失败,除非明确指定,c#,generics,C#,Generics,我以为我已经看到了一切,除了这个……:) 我在做一个字符串类型的通用图 Graph<string> graph = new Graph<string>(); 我是否完全缺少某些内容,或者不应该使用字符串比较方法。First().Value==“A”。(JIT编译器知道运行时使用的类型being,以及它支持的方法,对吗?)。在我看来,当不显式指定字符串时,它将执行引用检查,而不是字符串测试 如果有人能给我解释一下就好了 提前谢谢 ==是一种静态方法,因此不是虚拟方法。选择
Graph<string> graph = new Graph<string>();
我是否完全缺少某些内容,或者不应该使用字符串比较方法。First().Value==“A”。(JIT编译器知道运行时使用的类型being,以及它支持的方法,对吗?)。在我看来,当不显式指定字符串时,它将执行引用检查,而不是字符串测试
如果有人能给我解释一下就好了
提前谢谢
==
是一种静态方法,因此不是虚拟方法。选择要使用的==
方法是在编译时完成的,而不是在运行时。根据对象的编译时类型,它可能会为通过引用进行比较的对象选择=
的实现
如果改为使用虚拟
Equals
方法,这将按预期工作。如果节点的值
属性为对象
,则
Nodes.First().Value == "A"
将通过引用进行比较,而不是比较字符串。如果类型事先不是完全已知的(即,
Value
仅称为t
,严格来说不是字符串),请使用以下方法:
object.Equals(Nodes.First().Value,"A")
当然,您可以强制转换,但在这种情况下,您需要一个双强制转换((string)(object)
),这很难看
如果您知道两个对象的类型相同(即两个T
值),则可以使用:
EqualityComparer<T>.Default.Equals(x,y)
EqualityComparer.Default.Equals(x,y)
上述方法的优点是,它避免了结构的装箱,并支持提升的
null
运算符和IEquatable
以及Equals
属性的静态类型是什么?您确定该值定义为:public T Value{get;set;}
Nodes.First().Value == "A"
object.Equals(Nodes.First().Value,"A")
EqualityComparer<T>.Default.Equals(x,y)