Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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
C# 从vb.net到c的接口转换_C#_.net_Vb.net_Interface - Fatal编程技术网

C# 从vb.net到c的接口转换

C# 从vb.net到c的接口转换,c#,.net,vb.net,interface,C#,.net,Vb.net,Interface,我有一个覆盖受保护的GetService方法并将其分配给IServiceProvider接口的控件: Class MyControl Inherits Control Implements IServiceProvider Protected Overrides Sub GetService(t as Type) as Object Implements IServiceProvider.GetService End Sub End Class 我正在努力把

我有一个覆盖受保护的GetService方法并将其分配给IServiceProvider接口的控件:

Class MyControl
    Inherits Control
    Implements IServiceProvider

    Protected Overrides Sub GetService(t as Type) as Object Implements IServiceProvider.GetService
    End Sub

End Class

我正在努力把它转换成c。我试过隐式v。显式,但我一定是弄错了语法。

您可以这样做:

class MyControl : Control, IServiceProvider
{
     // Explicitly implement this
     object IServiceProvider.GetService(Type t)
     {
          // Call through to the protected version
          return this.GetService(t);
     }

     // Override the protected version...
     protected override object GetService(Type t)
     {
     }
}
也就是说,控件已经通过组件实现了IServiceProvider。你真的可以做到:

class MyControl : Control
{
     protected override object GetService(Type t)
     {
     }
}

您可以这样做:

class MyControl : Control, IServiceProvider
{
     // Explicitly implement this
     object IServiceProvider.GetService(Type t)
     {
          // Call through to the protected version
          return this.GetService(t);
     }

     // Override the protected version...
     protected override object GetService(Type t)
     {
     }
}
也就是说,控件已经通过组件实现了IServiceProvider。你真的可以做到:

class MyControl : Control
{
     protected override object GetService(Type t)
     {
     }
}

在移植到C时,需要考虑VB.Net接口实现的一些关键问题。VB.Net中实现的接口方法基本上在同一行中使用隐式和显式接口实现。这允许出现名称不匹配和非公共实现等情况

例如,以下也是IServiceProvider的合法实现

它大致转换为以下C代码

class Example : IServiceProvider {
  public object GetServiceWrongName(t as Type) {
    ..
  }

  object IServiceProvider.GetService(t as Type) {
    return GetServiceWrongName(t);
  }

}

在移植到C时,需要考虑VB.Net接口实现的一些关键问题。VB.Net中实现的接口方法基本上在同一行中使用隐式和显式接口实现。这允许出现名称不匹配和非公共实现等情况

例如,以下也是IServiceProvider的合法实现

它大致转换为以下C代码

class Example : IServiceProvider {
  public object GetServiceWrongName(t as Type) {
    ..
  }

  object IServiceProvider.GetService(t as Type) {
    return GetServiceWrongName(t);
  }

}

原来的VB.NET方法是受保护的,所以我想它相当于C中的显式接口实现:

class MyControl : Control, IServiceProvider
{
     object IServiceProvider.GetService(Type t)
     {
         ...
     }
}

原来的VB.NET方法是受保护的,所以我想它相当于C中的显式接口实现:

class MyControl : Control, IServiceProvider
{
     object IServiceProvider.GetService(Type t)
     {
         ...
     }
}

那不行。它说该方法无法实现它,因为它不是公共的。@Jules:很抱歉-太快了,并且忘记了VB.NET中的一个交互怪癖-我更新了,包括显示它在一开始确实没有必要…@Reed,您仍然不能在示例中使用protected,因为接口方法必须是公共的。也不能使用override,因为除非GetService实现也被标记为虚拟,否则您将得到一个“找不到合适的方法”来重写编译器错误。该方法应用于MyControl:Control案例。@Anthony:不正确。我在这里重写Component.GetService,它是受保护的虚拟服务。在我最初的混乱之后,我把它放进了一个编译器,以确保它能正常工作。请参阅:“里德,这将教我考虑实际对象被引用而不是泛泛而谈。”哎呀。但是,是的,如果控件或它的基实现了接口的明确性,并提供了一个具有类似名称的虚拟方法,那么代码确实可以工作。但这不起作用。它说该方法无法实现它,因为它不是公共的。@Jules:很抱歉-太快了,并且忘记了VB.NET中的一个交互怪癖-我更新了,包括显示它在一开始确实没有必要…@Reed,您仍然不能在示例中使用protected,因为接口方法必须是公共的。也不能使用override,因为除非GetService实现也被标记为虚拟,否则您将得到一个“找不到合适的方法”来重写编译器错误。该方法应用于MyControl:Control案例。@Anthony:不正确。我在这里重写Component.GetService,它是受保护的虚拟服务。在我最初的混乱之后,我把它放进了一个编译器,以确保它能正常工作。请参阅:“里德,这将教我考虑实际对象被引用而不是泛泛而谈。”哎呀。但是是的,如果控件或它的基显式地实现了接口,并提供了一个具有类似名称的虚拟方法,那么代码确实可以工作。它是这样实现的,还是显式地实现接口?我以为是后者…@Reed,它实际生成的代码根本无法用C表示。它生成一个方法,该方法具有将其指定为IServiceProvider.GetService覆盖的IL op代码。我发现以我的示例为例,编译它并在reflector中查看IL转储很有启发性。在C中获得等价代码的唯一方法是非公开、不同名称等。。。是两种方法的方法。它是这样实现的,还是显式地实现接口?我以为是后者…@Reed,它实际生成的代码根本无法用C表示。它生成一个方法,该方法具有将其指定为IServiceProvider.GetService覆盖的IL op代码。我发现以我的示例为例,编译它并在reflector中查看IL转储很有启发性。在C中获得等价代码的唯一方法是非公开、不同名称等。。。是两种方法的方法。不等同于显式实现,因为您可以从VB.Net中对MyControl的引用中调用它。这两者之间的转换实际上只能通过隐式和显式实现的结合来表达,这是值得欢呼的。我什么都试过了,但没有放弃
方法的名称。@Jules:请注意,这可能不会按您希望的方式进行。有关详细信息,请参见JaredPar或我的答案…不等同于显式实现,因为您可以在VB.Net中通过对MyControl的引用调用它。这两者之间的转换实际上只能通过隐式和显式实现的结合来表达,这是值得欢呼的。我什么都试过了,但没有提到方法的名称。@Jules:要知道,这可能不会像你希望的那样。有关详细信息,请参阅JaredPar或我的答案。。。