C# 4, per semplificare l'interoperabilità COM, consente ai chiamanti di interfacce COM di omettere la parola chiave ref di fronte agli argomenti per i parametri ref.Errore nel compilatore C# o normale dispari COM?
Sono stato sorpreso di vedere oggi che questo si applica anche ai metodi di estensione che estendono le interfacce COM. Vedere il seguente, codice di compilazione:
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);
}
}
Non ho trovato nulla nelle specifiche per spiegare questo comportamento.
La mia sensazione sarebbe che il codice all'esterno dell'interfaccia COM, anche se si tratta di un metodo di estensione che estende un'interfaccia COM, dovrebbe seguire le normali regole C# e imporre l'uso della parola chiave ref. Ho quindi depositato uno bug on connect. Non che io pensi che questo sarà risolto, anche se è considerato come un bug, c'è già del codice là fuori basandosi su questo.
Bug? Non è un bug?
Molto interessante. Le specifiche 4.0 sembrano essere ambigue qui.Dice che questo vale per i metodi di un tipo COM (sezione 22 + 22.1). Ma non sono riuscito a trovare nulla che dicesse esplicitamente o non dica che un metodo di estensione è considerato una parte di un tipo in questo modo. La mia ipotesi è che sia un bug. Sono sicuro che Eric sarà presto a chiarire. – JaredPar
Questo sicuramente sembra un bug. Il mio autobus non funziona ancora oggi a causa del congelamento della pioggia sulla neve, quindi sono lontano dall'ufficio. Darei un'occhiata alla settimana prossima. Grazie per aver inserito il problema su Connect! –