[英]Comparison of Generics in C#
為什么這段代碼打印錯誤?
class Program
{
public static void OpTest<T>(T s, T t) where T : class
{
Console.WriteLine(s == t);
}
static void Main()
{
string s1 = "string";
System.Text.StringBuilder sb = new System.Text.StringBuilder(s1);
string s2 = sb.ToString();
OpTest(s1, s2);
}
}
我是否正確理解,比較時,它們不是作為字符串進行比較,而是作為對象進行比較,這就是為什么不比較它們的值,而是它們指向的地址?
我通常會在評論中同意你,但你的例子特別好。
我是否正確理解,比較時,它們不是作為字符串進行比較,而是作為對象進行比較,這就是為什么不比較它們的值,而是它們指向的地址?
實際上並非如此。
如==
文檔中所述,
對於除string之外的引用類型,如果其兩個操作數引用同一對象,則
==
返回true。 對於string
類型,==
比較string
的值。
在您的特定情況下,原因是您在比較它們之前將它們作為泛型。 但如果這些是字符串對象,則會比較該值 。
我發現創建一個非通用的OpTest
方法來確認發生了什么是有幫助的。 泛型方法將參數視為Object
類型,並且不對String
使用==
重載,這是比較值的特殊情況。
在這兩種情況下,參數都是String
類型,但泛型方法在進行比較時會“一般”處理它們。
void Main()
{
string s1 = "string";
System.Text.StringBuilder sb = new System.Text.StringBuilder(s1);
string s2 = sb.ToString();
TestClass.OpTest(s1, s2);
TestClass.OpTest<string>(s1, s2);
// OpTest: s is System.String, t is System.String
// True
// OpTest<T>: s is System.String, t is System.String
// False
}
public class TestClass
{
public static void OpTest(string s, string t)
{
Console.WriteLine($"OpTest: s is {s.GetType()}, t is {t.GetType()}");
// Uses String's == operator, which compares the values
Console.WriteLine(s == t);
}
public static void OpTest<T>(T s, T t) where T : class
{
Console.WriteLine($"OpTest<T>: s is {s.GetType()}, t is {t.GetType()}");
// Uses Object's == operator, which is a reference comparison
Console.WriteLine(s == t);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.