簡體   English   中英

C#中泛型的比較

[英]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);
    }
}

我是否正確理解,比較時,它們不是作為字符串進行比較,而是作為對象進行比較,這就是為什么不比較它們的值,而是它們指向的地址?

==運算符文檔

對於預定義的值類型,如果操作數的值相等,則相等運算符( == )返回true ,否則返回false 對於除string之外的引用類型,如果其兩個操作數引用同一對象,則==返回true 對於string類型, ==比較string的值。

由於T不能保證是值類型,因為它是通用的,因此編譯器必須假定它是引用類型。

我通常會在評論中同意你,但你的例子特別好。

我是否正確理解,比較時,它們不是作為字符串進行比較,而是作為對象進行比較,這就是為什么不比較它們的值,而是它們指向的地址?

實際上並非如此。

==文檔中所述,

對於除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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM