Ambiguity between method and non-method. Using method group.

Przy korzystaniu z mechanizmów automatyzacji aplikacji Office w C# pojawić może się ostrzeżenie:

Ambiguity between method 'Microsoft.Office.Interop.Word._Document.Close(ref object, ref object, ref object)' and non-method 'Microsoft.Office.Interop.Word.DocumentEvents2_Event.Close'. Using method group.

Problem taki pojawi się np. w następującym kodzie:


using Microsoft.Office.Core;
using Microsoft.Office.Interop.Word;

[...]

Application wordApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application", true), true) as Application;
object missingValue = Missing.Value;
object saveChanges = false;

[...]

wordApplication.Quit(ref saveChanges, ref missingValue, ref missingValue);

Przyczynę niejednoznaczności (ang. ambiguity) odnajdziemy zaglądając do definicji interfejsu Application:


using System.Runtime.InteropServices;

namespace Microsoft.Office.Interop.Word {
[Guid("00020970-0000-0000-C000-000000000046")]
[CoClass(typeof(ApplicationClass))]
public interface Application: _Application, ApplicationEvents4_Event {
}
}

i dalej w interfejsach po których dziedziczy Microsoft.Office.Interop.Word.Application:

w Microsoft.Office.Interop.Word._Application

[DispId(1105)]
void Quit(ref object SaveChanges, ref object OriginalFormat, ref object RouteDocument);

a w Microsoft.Office.Interop.Word.ApplicationEvents4_Event

event ApplicationEvents4_QuitEventHandler Quit;

Widać więc, że interfejsy te zawierają powielone nazwy odnoszące się do różnych składowych.
Podobny problem dotyczy także innych metod wywoływanych na rzecz obiektów automatyzacji, np. metody Close.

Prostym rozwiązaniem umożliwiającym pozbycie się niepotrzebnego ostrzeżenia jest jawne rzutowanie na właściwy interfejs, z którego nazwy chcemy użyć, czyli linię powodującą warning:

wordApplication.Quit(ref saveChanges, ref missingValue, ref missingValue);

wystarczy zamienić na:

(wordApplication as _Application).Quit(ref saveChanges, ref missingValue, ref missingValue);

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *