Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么界面需要强制转换?_.net_C# 4.0 - Fatal编程技术网

.net 为什么界面需要强制转换?

.net 为什么界面需要强制转换?,.net,c#-4.0,.net,C# 4.0,我正试图创建一个接口实例,但由于转换错误而失败 下面的简单场景可以很好地工作 class Employee:IEmployee { public Employee (int Id) {} public string Name {get;set;} } interface IEmployee { string Name {get;set;} } //执行 IEmployee employee = new Employee(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);
Director确实实现了IDirector。这些是单个对象,而不是列表到单个对象

如果我通过类构造函数传入一个接口并尝试将其分配给实现该接口的类类型,它也不起作用:

private ClassB classb;

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

知道为什么在某些情况下需要强制转换而在其他情况下不需要强制转换吗?

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

考虑以下接口和类代码:

interface IClassA 
{
   int MemOfA;
}

interface IClassB
{
   int MemOfB;
}

class MyClass : IClassA,IClassB
{
   int MemOfA;
   int MemOfB;
}
现在在一些代码块中,我们定义了类
MyClass
的一个实例(考虑到
iIClassA
是接口
IClassA
的一个实例):

为什么会出错

如何在
MyClass
中设置
IClassB
的成员?然而,如果
MyClass
只实现
IClassA
,我们就不能再这样做了!因为同样可能是
IClassA
继承了多个接口

private ClassB classb;

Public ClassA (IClassB classbInterfaceInstance)
{
  classb = classbInterfaceInstance;
}
要使这段代码正常工作是不可能的。记住:ClassB实现IClassB。所以B类总是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;
  }
}

Director
是直接实现
IDirector
,还是仅仅提供一个转换运算符?它实现了接口。这是因为您忘记在
Director
内部实现
IDirector
:-)您应该发布Director类。可能缩小了,但仍然存在问题。我认为这是VisualStudio的怪异之处。我有两个不同类的实例发生了这种情况。几次构建之后,错误的onc实例消失了。在另一个构建之后,这个项目的一切都很好。我构建了解决方案,现在也可以了。这不是我正在做的。反过来说。问题似乎是VS.NET出现了一些奇怪的问题,而不是代码错误。然后显示您正在做什么?编辑你的问题并解释它!
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;
  }
}