如何在没有明确转换的情况下始终获得正确的类型
问题描述:
这是我的问题。我有以下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;
}
}
明确地隐藏了被继承的成员来自基类
答
你要求的确切的东西在C#中是不可能的。没有返回类型表示“返回值是this
,因此它的类型是已知的”。从类型系统的角度来看,没有任何意义,因为返回void
已经给调用者提供了所有必需的信息(调用者已经拥有调用它的对象)。从C#的角度来看,它确实可以导致更简洁的代码。
它周围的一种方法是使用泛型:
public class C1<T> where T : C1<T> {
public T GetThis() { return (T) this; }
}
public class C2 : C1<C2> { }
这不是类型安全的,因为真正的“返回this
”型或注解,因为它允许C3
从C1<C2>
派生为好,这将导致运行时抛出异常,因此不会有编译时诊断。