建議42 使用泛型引數相容泛型介面的不可變性

2021-07-22 11:31:17 字數 1090 閱讀 3499

建議42:使用泛型引數相容泛型介面的不可變性

讓返回值型別返回比宣告的型別派生程度更大的型別,就是「協變」。如:

public employee getaemployee(string

name)

;//programmer是employee的子類

}

programmer是employee的子類,所以programmer物件也是employee物件。方法getaemployee返回乙個programmer的物件,也就是相當於返回乙個employee物件。

由於協變是一種如此自然的應用,我們很可能寫出如下**:

class

program

static void printsalary(isalary s)

}

inte***ce isalary

class basesalarycounter: isalary

}class

employee

}class

programmer : employee

class

manager : employee

在printsalary這個方法中,方法接收的型別是isalary。於是,我們想當然的認為isalary必然也可以被printsalary方法接收的。事實卻不然,**編譯會通不過:

無法從「mytest.isalary」轉換為「mytest.isalary」

編譯器對於介面和委託型別引數的檢查是非常嚴格的,除非用關鍵字out特別宣告,不然這段**只會編譯失敗。要讓printsalary完成需求,我們可以使用泛型型別引數:

static

void printsalary(isalarys)

注意:建議開頭指出「協變」是針對返回值而言的,但是所舉的這個例子並沒有體現「返回值」這個概念。實際上,只有泛型型別引數在乙個介面宣告中不被用來作為方法的輸入引數,我們就姑且把它看成是「返回值」型別的。所以,本建議中這種模式是滿足「協變」定義的。但是,只要將t作為輸入引數,就不滿足「協變」定義了。

**:《編寫高質量**改善c#程式的157個建議》陸敏技

泛型程式設計之泛型引數

問題 用c 語言實現求乙個數的平方。分析 乙個數,可以是int double complex等,規則求數的平方 x x 偽 sqrt x return x x 實現一 提供一組用於求不同數字型別的平方函式。int sqrtint int x int sqrtdouble double x 實現二 上...

泛型結構使用大全(泛型類 泛型介面)

1 泛型類可能有多個引數,此時應將多個引數一起放到尖括號內,比如 2 泛型類的構造器如下 public genericclass 錯誤示例 public genericclass 3 例項化後,操作原來泛型位置的結構必須與指定的泛型型別一致。4 泛型不同的引用不能互相賦值。儘管在編譯時arrayli...

C 泛型 使用泛型List

一 泛型的優點 效能高。從前面的例子可以看出使用不需進行型別轉換,可以避免裝箱和拆箱操作,提高效能。型別安全。泛型集合對其儲存物件進行了型別約束,不是定義時宣告的型別,是無法儲存到泛型集合中的,保證了資料型別的安全。重用。使用泛型型別可以最大限度地重用 保護型別的安全以及提高效能。使用泛型 使用泛型...