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. Поэтому я зарегистрировал ошибку при соединении . Не то чтобы я думаю, что это будет исправлено, даже если это будет считаться ошибкой, уже есть код, основанный на этом.
Ошибка? Это не ошибка?