2014-02-27 109 views
-1

我试图创建一个实例对接口,但它失败了一个转换转换错误。为什么接口需要强制转换?

以下简单方案正常工作。

class Employee:IEmployee 
{ 
    public Employee (int Id) {} 
    public string Name {get;set;} 
} 

interface IEmployee 
{ 
    string Name {get;set;} 
} 

//执行

IEmployee employee = new Employee(1) 

我在相同的情况下是行不通的大课。他们主要是更大的班级。我得到下面的编译时错误:

Cannot implicitly convert type 'IDirector' to 'Director'. An explicit conversion exists (are you missing a cast?) 

代替上述类型的语法的,我必须使用此:

IDirector myDirector = (IDirector)new Director(directorId); 

主任确实实现IDirector。这些是单个对象,而不是单个对象列表。

它也不会,如果我在通过类的构造函数传递一个接口和工作尝试将其分配到实现该接口的类的类型:

private ClassB classb; 

Public ClassA (IClassB classbInterfaceInstance) 
{ 
    classb = classbInterfaceInstance; 
} 

任何想法,为什么需要在一些投案件但不是其他人?

+2

'Director'是直接实现'IDirector'还是简单地提供一个转换操作符? –

+0

它实现了接口。 – 4thSpace

+0

这是因为你忘了在'Director'里面实现'IDirector' :-) – dasblinkenlight

回答

0

您不能将接口实例分配给其驱动类。有一个深刻的概念,但我用简单的例子来展示它。

考虑这个接口和类代码:

interface IClassA 
{ 
    int MemOfA; 
} 

interface IClassB 
{ 
    int MemOfB; 
} 

class MyClass : IClassA,IClassB 
{ 
    int MemOfA; 
    int MemOfB; 
} 

现在一些代码块中,我们定义MyClass类的一个实例(考虑到iIClassA是接口IClassA的一个实例):

MyClass a = iIClassA; // error ! 

为什么错误?

我们如何在MyClass中设置IClassB的成员?但是,如果MyClass只会再执行IClassA,我们无法做到!因为再次可能是IClassA继承了多个接口。

+0

这不是我正在做的事情。这是相反的方式。问题似乎与VS.NET有些奇怪,而不是代码错误。 – 4thSpace

+1

然后显示你在做什么?编辑你的问题并解释它! –

0
private ClassB classb; 

Public ClassA (IClassB classbInterfaceInstance) 
{ 
    classb = classbInterfaceInstance; 
} 

这是不可能得到此代码的工作。记住:ClassB实现IClassB。所以ClassB总是IClassB。 但是想想下面的场景: 你有一个接口:IClassB。有两个类 - ClassB1和ClassB2。两者都实现IClassB。

interface IClassB {} 
class ClassB1 {} 
class ClassB2 {} 

IClassB foo = new ClassB2(); 
ClassB1 = foo; //this can not work. Because you are trying to cast ClassB2 to ClassB1 

看看我的代码。这正是你在做什么:

private ClassB classb; 
//workaround 1) 
private IClassB classb; 

Public ClassA (/*workaround 2)*/ ClassB /*instaed of IClassB*/ classbInterfaceInstance) 
{ 
    //remember that classbInterfaceInstance can be ClassB2, ClassB3, ... what ever. But you are casting it into ClassB. 
    classb = classbInterfaceInstance; 

    //possible workarounds: 
    // 1) make the "classb" field of type "IClassB" (see above) 
    // 2) change the type of the classbInterfaceInstance parameter to ClassB 
    // 3) try to cast the parameter (see code below) 

    //workaround 3) 
    if(classbInterfaceInstance is ClassB) 
    { 
    classb = (ClassB)classbInterfaceInstance; 
    } 
} 
相关问题