Ошибка компилятора C # или обычная странность COM?

C # 4, чтобы упростить COM-взаимодействие, позволяет вызывающим COM-интерфейсам опускать ключевое слово ref перед аргументами для параметров by ref.

Я был удивлен, увидев сегодня, что это также применимо к методам расширения, расширяющим COM-интерфейсы. См. Следующий код компиляции:

using System;
using System.Runtime.InteropServices;

[ComImport, Guid ("cb4ac859-0589-483e-934d-b27845d5fe74")]
interface IFoo {
}

static class Program {

    public static void Bar (this IFoo self, ref Guid id)
    {
        id = Guid.NewGuid ();
    }

    static void Main ()
    {
        Foo (null);
    }

    static void Foo (IFoo o)
    {
        Guid g = Guid.NewGuid ();
        Console.WriteLine (g);

        // note that g is passed as is, and not as ref g    
        o.Bar (g);

        Console.WriteLine (g);
    }
}

Я не нашел ничего в спецификации, чтобы объяснить такое поведение.

Мне кажется, что код вне COM-интерфейса, даже если это метод расширения, расширяющий COM-интерфейс, должен следовать обычным правилам C # и обеспечивать использование ключевого слова ref. Поэтому я зарегистрировал ошибку при соединении . Не то чтобы я думаю, что это будет исправлено, даже если это будет считаться ошибкой, уже есть код, основанный на этом.

Ошибка? Это не ошибка?

18
задан Jb Evain 19 January 2012 в 17:30
поделиться