РЕДАКТИРОВАТЬ: я написал результаты в виде сообщения в блоге .
Компилятор C # обрабатывает COM-типы магическим образом. Например, это утверждение выглядит нормально ...
Word.Application app = new Word.Application();
... пока не поймешь, что Application
это интерфейс. Вызов конструктора для интерфейса? Йойку! Это на самом деле переводится в вызов Type.GetTypeFromCLSID()
и другой Activator.CreateInstance
.
Кроме того, в C # 4 вы можете использовать не-ref аргументы для 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.