类内的C#调用接口方法

类内的C#调用接口方法,c#,class,interface,call,C#,Class,Interface,Call,不要将用作,只需强制转换: interface ILol { void LOL(); } class Rofl : ILol { void ILol.LOL() { GlobalLOLHandler.RaiseROFLCOPTER(this); } public Rofl() { //Is there shorter way of writing this or i is there "other" problem with impl

不要将
用作
,只需强制转换:

interface ILol
{
   void LOL();
}

class Rofl : ILol
{
   void ILol.LOL()
   {
      GlobalLOLHandler.RaiseROFLCOPTER(this);
   }
   public Rofl()
   {
      //Is there shorter way of writing this or i is there "other" problem with implementation??
      (this as ILol).LOL();
   }
}

您可能需要将强制转换从
(此为ILol)
更改为
((ILol)此)
。as cast允许返回null,这可能会在以后导致混淆错误,编译器必须对其进行测试。

如果您显式实现接口,则不允许返回null。如果通过从实现的方法中删除接口名使其隐式化,它将按您的需要工作

((ILol)this).LOL();

您已经实现了通常不需要执行的接口。相反,只需隐式实现它,并像调用任何其他方法一样调用它:

void LOL()
{
    GlobalLOLHandler.RaiseROFLCOPTER(this);
}
public Rofl()
{
    LOL();
}

(注意,您的实现也需要公开。)

您根本不需要强制转换。由于
ROFL
实现了
ILOL
,因此您可以简单地调用
this.LOL()
甚至只调用
LOL()

您意识到您的代码示例仍然显式地实现了它,对吗?:)隐式和显式实现之间的区别是什么?如果我不加我的名字。在LOL之前,编译器会抱怨没有实现ILol.LOL。只有当对象转换为接口类型时,才能调用显式接口。这有各种模糊的优点,但否则你应该避免它。至于为什么你的代码不起作用,我只能猜测:实现你的接口的方法是否可以公开访问?澄清一下:ladenedge在上面的评论中说的是,OP需要在他的声明前面添加
public
,当他拿走
ILol.
-1时,他错了。ROFL显式实现
ILOL
,并且在没有访问
ILOL
实例(
this
casted)的情况下无法访问
ILOL
成员。是否再次?
as
强制转换与非
as
强制转换有什么问题?在检查null之前使用从
as
返回的对象是一种不好的做法。上面的代码在编写时不会出现任何问题,但在重构过程中不会有太大的恢复力。as cast可能返回null,因此编译器需要在调用该方法之前测试null,以便生成null引用异常。常规强制转换永远不能返回null,因此编译器可以省略null测试。上面的讨论可能会让最近学会将
用作
的人感到困惑,因此他们可以处理无法将对象强制转换为目标类型的情况。规则是:如果您不能100%确定强制转换始终有效,请使用
作为
,然后测试结果是否为
null
。如果它不可能失败[在这里,我们知道
这是一个
ILol
,因为它被定义为],那么就直接执行强制转换,
(ILol)
。尽量避免从构造函数调用“虚”函数!您可能会调用访问未完全构造的对象的实现。
class Rofl : ILol
{
    public void LOL() { ... }

    public Rofl()
    {
        LOL();
    }
}