2016-09-16 2 views
0

У меня есть метод, который возвращает ссылку на интерфейс IInterfaceA, и хочу, чтобы бросить его в IInterfaceB сделать это:Cast к интерфейсу ребенка

IInterfaceA a = SomeMethodThatReturnAnIInterfaceA(); 
IInterfaceB b = (IInterfaceB)a; 

public IInterfaceA : OtherInterfaceA, OtherInterfaceB {} 
public IInterfaceB : IInterfaceB {} 

Но во время выполнения я получил:

Unable to cast COM object of type 'OPCAutomation.OPCGroupClass' to interface 
type 'SemaforosNNM.OPC.OPCDaGroup'. This operation failed because the 
QueryInterface call on the COM component for the interface with IID 
'{70F93164-7F80-37E3-8EFB-DAB08298316E}' failed due to the following error: 
Interfaz no compatible (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)). 

Что нам здесь не хватает?

+2

Ну, вам не хватает кода, который будет скомпилирован для начала. –

+2

Нет никаких указаний на то, что существуют две помехи. Прочитайте [mcve] руководство и [править] сообщение соответственно. –

ответ

0

Я предполагаю следующую строку:

public interface IInterfaceB: IInterfaceB 

в действительности:

public interface IInterfaceB : IInterfaceA 

Давайте поместим имена, которые легче понять:

public interface IAnimal //IInterfaceA 
public interface ICat : IAnimal //IInterfaceB 
public interface IDog : IAnimal //another IInterfaceB 

IAnimal someAnimal = GetMeADog(); 
ICat catAndDogsDontMix = (ICat)someAnimal; //ouch! 

Теперь вы понимаете, почему вы не можете передать в «дочерний» интерфейс?

Странно, однако, что вы показываете ошибку времени выполнения; код, который вы опубликовали, даже не должен компилироваться. Вы уверены, что ваш код правильно воспроизводит вашу проблему? Может быть a напечатан object?