建議44:理解委託中的協變
委託中的泛型變數天然是部分支援協變的。為什麼是「部分支援協變」?看下面示例:
class上中的getamanager返回的是乙個manager,但是在使用中,其實是將其賦值給乙個泛型引數為employee的委託變數。因為存在下面一種情況,所以編譯不過:program
static manager getamanager(string
name);}
static employee getaemployee(string
name);}
}inte***ce isalary
class basesalarycounter: isalary
}class
employee
}class
programmer : employee
class
manager : employee
getemployeehanldergetamanager =getamanager;要讓上面的**編譯通過,同樣需要為委託中的泛型引數指定out關鍵字:getemployeehanlder
getaemployee = getamanager;
public除非考慮到該委託宣告肯定不會用於可變性,否則,為委託中的泛型引數指定out關鍵字將會拓展委託的應用,建議在實際編碼過程中永遠這樣使用。實際上,fcl4.0中的一些委託宣告已經用out關鍵字來讓委託支援協變了,如我們常常會使用到的:delegate t getemployeehanlder(string name);
public**:《編寫高質量**改善c#程式的157個建議》陸敏技delegate tresult func();
public
delegate toutput converter(tinput input);
7 1 8 委託中的協變和抗變
7.1.8 協變和抗變 委託呼叫的方法不需要與委託宣告定義的型別相同。因此可能出現協變和抗變。1.返回型別協變 方法的返回型別可以派生於委託定義的型別。在下面的示例中,委託mydelegate定義為返回delegatereturn型別。賦予委託例項d1的方法返回delegatereturn2型別,d...
C 委託中的協變與逆變
1 簽名 返回值型別和引數。2 委託呼叫要求委託的簽名必須與呼叫的方法的簽名匹配,如果簽名不匹配,將無法通過編譯器的型別檢查。3 協變 允許所呼叫方法的返回型別可以是委託的返回型別的派生型別,當委託方法的返回型別具有的派生程度比委託簽名更大時,就稱為協變委託方法。協變委託方法的優點是 使得建立可被類...
C 中協變與逆變的個人理解
讀了園子中一些前輩的關於c 中協變與逆變的文章,收穫很大,分享一下我的個人理解,希望用較淺顯的方式理解這個比較繞彎的概念。協變與逆變應該是clr的特性,我僅對我熟悉的c 舉例說明。說白了,它主要解決的是乙個型別轉換的問題,用乙個最簡單的泛型表示式就是 s s 當然這只是乙個抽象的表示式,而且只包含了...