建議44 理解委託中的協變

2021-07-22 11:38:26 字數 1024 閱讀 7511

建議44:理解委託中的協變

委託中的泛型變數天然是部分支援協變的。為什麼是「部分支援協變」?看下面示例:

class

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

上中的getamanager返回的是乙個manager,但是在使用中,其實是將其賦值給乙個泛型引數為employee的委託變數。因為存在下面一種情況,所以編譯不過:

getemployeehanldergetamanager =getamanager;

getemployeehanlder

getaemployee = getamanager;

要讓上面的**編譯通過,同樣需要為委託中的泛型引數指定out關鍵字:

public

delegate t getemployeehanlder(string name);

除非考慮到該委託宣告肯定不會用於可變性,否則,為委託中的泛型引數指定out關鍵字將會拓展委託的應用,建議在實際編碼過程中永遠這樣使用。實際上,fcl4.0中的一些委託宣告已經用out關鍵字來讓委託支援協變了,如我們常常會使用到的:

public

delegate tresult func();

public

delegate toutput converter(tinput input);

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

7 1 8 委託中的協變和抗變

7.1.8 協變和抗變 委託呼叫的方法不需要與委託宣告定義的型別相同。因此可能出現協變和抗變。1.返回型別協變 方法的返回型別可以派生於委託定義的型別。在下面的示例中,委託mydelegate定義為返回delegatereturn型別。賦予委託例項d1的方法返回delegatereturn2型別,d...

C 委託中的協變與逆變

1 簽名 返回值型別和引數。2 委託呼叫要求委託的簽名必須與呼叫的方法的簽名匹配,如果簽名不匹配,將無法通過編譯器的型別檢查。3 協變 允許所呼叫方法的返回型別可以是委託的返回型別的派生型別,當委託方法的返回型別具有的派生程度比委託簽名更大時,就稱為協變委託方法。協變委託方法的優點是 使得建立可被類...

C 中協變與逆變的個人理解

讀了園子中一些前輩的關於c 中協變與逆變的文章,收穫很大,分享一下我的個人理解,希望用較淺顯的方式理解這個比較繞彎的概念。協變與逆變應該是clr的特性,我僅對我熟悉的c 舉例說明。說白了,它主要解決的是乙個型別轉換的問題,用乙個最簡單的泛型表示式就是 s s 當然這只是乙個抽象的表示式,而且只包含了...