C# 4 では、COM 相互運用を簡素化するために、COM インターフェイスの呼び出し元が by ref パラメーターの引数の前にある 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 キーワードの使用を強制する必要があると思います。したがって、私はconnect にバグを報告しました。これが修正されるとは思いません。バグと見なされても、これに依存するコードが既に存在します。
バグ?バグじゃない?