C# 4, para simplificar la interoperabilidad COM, permite a las personas que llaman a las interfaces COM omitir la palabra clave ref delante de los argumentos por los parámetros ref.¿Error del compilador C# o rareza COM normal?
Me sorprendió ver hoy que esto también se aplica a los métodos de extensión que amplían las interfaces COM. Véase el siguiente, la compilación, el código:
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);
}
}
no he encontrado nada en la especificación para explicar este comportamiento.
Mi impresión sería que el código fuera de la interfaz COM, incluso si se trata de un método de extensión que amplía una interfaz COM, debería seguir las reglas normales de C# e imponer el uso de la palabra clave ref. Por lo tanto, presenté un bug on connect. No es que crea que esto se solucione, incluso si se considera un error, ya hay un código que se basa en esto.
Error? No es un error?
muy interesante. La especificación 4.0 parece ser ambigua aquí.Dice que esto se aplica a los métodos de un tipo COM (sección 22 + 22.1). Pero no pude encontrar nada que explícitamente diga o no diga que un método de extensión se considera parte de un tipo de esta manera. Yo creo que es un error. Estoy seguro de que Eric llegará pronto para aclarar. – JaredPar
Eso seguro suena como un error. Mi autobús todavía no está funcionando hoy debido a la lluvia helada sobre la nieve, por lo que estoy lejos de la oficina. Lo echaré un vistazo la próxima semana. Gracias por ingresar al problema en Connect! –