object fileName = "Test.docx";
object missing = System.Reflection.Missing.Value;
doc.SaveAs(ref fileName,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing);
4.0中就可以直接寫成:
doc.SaveAs("Test.docx");
C#4.0對COM交互做了下面幾方面的改進:
Automatic object -> dynamic mapping
Optional and named parameters
Indexed propertIEs
Optional “ref” modifIEr
Interop type embedding (“No PIA”)
對第1點和第5點的簡單解釋如下:
在COM調用中,很多輸入輸出類型都是object,這樣就必須知道返回對象的確切類型,強制轉換後才可 以調用相應的方法。在4.0中有了dynamic的支持,就可以在導入這些COM接口時將變量定義為dynamic而不 是object,省掉了強制類型轉換。
PIA(Primary Interop AssemblIEs)是根據COM API生成的.Net Assembly,一般體積比較大。在4.0 中運行時不需要PIA的存在,編譯器會判斷你的程序具體使用了哪一部分COM API,只把這部分用PIA包裝 ,直接加入到你自己程序的Assembly裡面。
Co- and Contra-Variance
實在是不知道怎麼翻譯這兩個詞。
在C#中,下面的類型轉換是非法的:
IList<string> strings = new List<string>();
IList<object> objects = strings;
因為你有可能會這樣做,而編譯器的靜態檢查無法查出錯誤:
objects[0] = 5;
string s = strings[0];