gpt4 book ai didi

带约束的 C# 模板

转载 作者:太空宇宙 更新时间:2023-11-03 22:42:57 25 4
gpt4 key购买 nike

为什么在这段代码中会打印出false?我检查了 stirngs 的内容是否完全相同,但输出不是预期的。这可能是由于对模板施加了约束吗?

public static void OpTest<T>(T s, T t) where T : class
{
System.Console.WriteLine(s == t);
}

static void Main()

{
string s1 = "string";

System.Text.StringBuilder sb = new System.Text.StringBuilder(s1);
string s2 = sb.ToString();

OpTest<string>(s1, s2);
System.Console.ReadKey();

}

最佳答案

Could this be due to the imposed constraint for the template?

通用方法中的 == 运算符使用重载 (string) 版本。请引用this回答有关此的更多信息。

所以在这个泛型方法中使用的==运算符是有区别的:

public static void OpTest<T>(T s, T t) where T : class
{
System.Console.WriteLine(s == t);
}

...在这个非通用的例子中:

public static void OpTest(string s, string t)
{
System.Console.WriteLine(s == t);
}

正如@Dmitry Bychenko 所建议的,您可以通过使用 Equals 方法来比较元素而不是使用 == 运算符来“修复”您的通用方法:

public static void OpTest<T>(T s, T t) where T : class
{
System.Console.WriteLine(Equals(s, t));
}

最好为 T 类型使用默认的 EqualityComparer,因为这样可以避免任何装箱和转换:

public static void OpTest<T>(T s, T t) where T : class
{
System.Console.WriteLine(EqualityComparer<T>.Default.Equals(s, t));
}

关于带约束的 C# 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51380088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com