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)