แก้ไข:ฉันได้เขียนผลขึ้นเป็นบล็อกโพสต์
คอมไพเลอร์ C # ใช้ COM ประเภทค่อนข้างน่าอัศจรรย์ ตัวอย่างเช่นคำสั่งนี้ดูเหมือนปกติ ...
Word.Application app = new Word.Application();
... จนกว่าคุณจะรู้ว่านั่นApplication
คือส่วนต่อประสาน การเรียกตัวสร้างบนอินเทอร์เฟซหรือไม่ Yoiks! นี้จริงได้รับการแปลเป็นโทรไปType.GetTypeFromCLSID()
และอื่น ๆ Activator.CreateInstance
เพื่อ
นอกจากนี้ใน C # 4 คุณสามารถใช้อาร์กิวเมนต์ที่ไม่อ้างอิงสำหรับref
พารามิเตอร์และคอมไพเลอร์เพิ่งเพิ่มตัวแปรท้องถิ่นที่จะผ่านการอ้างอิงโดยยกเลิกผลลัพธ์:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(ใช่มีข้อโต้แย้งจำนวนมากหายไปพารามิเตอร์ตัวเลือกไม่ดีใช่ไหม :)
ฉันพยายามตรวจสอบพฤติกรรมของคอมไพเลอร์และฉันไม่ได้ปลอมส่วนแรก ฉันสามารถทำส่วนที่สองโดยไม่มีปัญหา:
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
[ComImport, GuidAttribute("00012345-0000-0000-0000-000000000011")]
public interface Dummy
{
void Foo(ref int x);
}
class Test
{
static void Main()
{
Dummy dummy = null;
dummy.Foo(10);
}
}
ฉันต้องการเขียน:
Dummy dummy = new Dummy();
แม้ เห็นได้ชัดว่ามันจะทำงานได้อย่างราบรื่นในเวลาดำเนินการ แต่ก็ไม่เป็นไร ฉันแค่ทดลอง
คุณลักษณะอื่น ๆ ที่คอมไพเลอร์เพิ่มเข้ามาสำหรับ COM PIA ที่เชื่อมโยง ( CompilerGenerated
และTypeIdentifier
) ดูเหมือนจะไม่หลอกลวง ... อะไรคือเวทย์มนตร์
dynamic
... เราแค่คุ้นเคยกับการพิมพ์แบบคงที่ / แข็งแรงเพื่อดูว่าทำไมมันถึงมีความสำคัญนอก COM