C# 4, aby uprościć współdziałanie COM, zezwól wywołującym na interfejsy COM, aby pominąć słowo kluczowe ref przed argumentami dla parametrów ref.Błąd kompilatora C# lub normalne zdarzenie COM?
Zaskoczyło mnie, że dzisiaj dotyczy to również metod rozszerzających, które rozszerzają interfejsy COM. Zobacz poniższy kod, kompilacja:
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);
}
}
Nie znalazłem nic w specyfikacji, aby wyjaśnić to zachowanie.
Mam wrażenie, że kod poza interfejsem COM, nawet jeśli jest to metoda rozszerzająca rozszerzająca interfejs COM, powinien być zgodny z normalnymi regułami C# i wymuszać użycie słowa kluczowego ref. Dlatego też złożyłem wniosek o wydanie bug on connect. Nie sądzę, że to się naprawi, nawet jeśli zostanie to uznane za błąd, ale istnieje już kod, który polega na tym.
Błąd? Nie błąd?
Bardzo interesująca. Specyfikacja 4.0 wydaje się tutaj niejednoznaczna.Mówi się, że dotyczy to metod typu COM (rozdział 22 + 22.1). Ale nie mogłem znaleźć niczego, co wyraźnie mówi lub nie mówi, że metoda rozszerzenia jest uważana za część typu w ten sposób. Zgaduję, że to błąd. Jestem pewien, że Eric wkrótce będzie z nami, żeby wyjaśnić. – JaredPar
To z pewnością brzmi jak błąd. Mój autobus nadal nie działa dzisiaj z powodu mroźnego deszczu nad śniegiem, więc jestem z dala od biura. Przyjrzę się temu w przyszłym tygodniu. Dziękujemy za zgłoszenie problemu w serwisie Connect! –