簡體   English   中英

C#泛型類型相等運算符

[英]C# generic types equality operator

來自https://msdn.microsoft.com/en-us/library/d5x73970.aspx

在應用where T:class約束時,請避免使用type參數上的==和!=運算符,因為這些運算符將僅測試引用標識,而不是值相等。 即使這些運算符在用作參數的類型中重載,也是如此。 以下代碼說明了這一點; 即使String類重載==運算符,輸出也是假的。

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

static void Main()
{
    string s1 = "target";
    System.Text.StringBuilder sb = new System.Text.StringBuilder("target");
    string s2 = sb.ToString();
    OpTest<string>(s1, s2);
}

一切都很好,直到我嘗試跟隨,用同樣的方法

static void Main()
{
    string s1 = "target";
    string s2 = "target";
    OpTest<string>(s1, s2);
}

它輸出'True',s1和s2引用內存中的不同對象,即使它們具有相同的值對嗎? 我錯過了什么嗎?

字符串在.NET中實現,所以當你這樣做時

string s1 = "target";
string s2 = "target";

他們都指向同一個對象。 這就是MSDN示例使用StringBuilder ,這使得CLR無法創建具有相同值的另一個字符串對象,因此泛型方法中的運算符測試將返回false。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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