如何在没有显式转换的情况下获得始终正确的类型

时间:2017-09-26 08:02:53

标签: c# c#-6.0

这是我的问题。我有以下两个班级:

public class C1
{
    public C1 GetThis()
    {
        return this;
    }
}

public class C2:C1
{

}

现在,我想以下列方式使用这些类:

private static void Main(string[] args)
{
    C1 c1 = new C1().GetThis(); //1st line
    C2 c2 = new C2().GetThis(); //2nd line
}

但是,第二行不起作用。为了使它工作,我必须这样投射:

C2 c2 = (C2)new C2().GetThis(); //2nd line

但是,我是一个非常懒惰的人,并试图避免编写显式转换(演员表)。 所以问题是:我应该如何更改GetThis()方法的实现/声明,以便第二行在没有任何强制转换的情况下工作?

感谢您的任何提示。

2 个答案:

答案 0 :(得分:4)

  

我应该如何更改GetThis()方法的实现/声明?

一种可能性是使用C2修饰符在类new中声明具有相应返回值的方法:

public class C2 : C1
{
    public new C2 GetThis()
    {
        return this;
    }
}

new modifier

  

显式隐藏从基类继承的成员

答案 1 :(得分:3)

C#中无法提供您要求的确切内容。没有返回类型表示"返回值为this,因此其类型已知"。从类型系统的角度来看,它没有任何意义,因为返回void已经为调用者提供了所有必需的信息(调用者已经拥有了调用它的对象)。从C#的角度来看,它可以带来更清晰的代码。

一种方法是使用泛型:

public class C1<T> where T : C1<T> {
  public T GetThis() { return (T) this; }
}

public class C2 : C1<C2> { }

这不是真正的类型安全&#34;返回this&#34;类型或注释,因为它允许C3C1<C2>派生,这将导致在运行时抛出异常,因此不会有编译时诊断。