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

问题描述:

这是我的问题。我有以下2类:如何在没有明确转换的情况下始终获得正确的类型

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()方法的实现/声明,以便第二行在没有任何投射的情况下工作?

谢谢你的任何提示。

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

一种可能性是使用new改性剂与相应的返回值来声明该方法在类C2

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

new modifier

明确地隐藏了被继承的成员来自基类

你要求的确切的东西在C#中是不可能的。没有返回类型表示“返回值是this,因此它的类型是已知的”。从类型系统的角度来看,没有任何意义,因为返回void已经给调用者提供了所有必需的信息(调用者已经拥有调用它的对象)。从C#的角度来看,它确实可以导致更简洁的代码。

它周围的一种方法是使用泛型:

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

public class C2 : C1<C2> { } 

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