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 上提交了一个错误。并不是说我认为这会被修复,即使它被认为是一个错误,也已经有依赖于此的代码。
漏洞?不是bug?