这是我的问题。我有以下两个班级:
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()方法的实现/声明,以便第二行在没有任何强制转换的情况下工作?
感谢您的任何提示。
答案 0 :(得分:4)
我应该如何更改GetThis()方法的实现/声明?
一种可能性是使用C2
修饰符在类new
中声明具有相应返回值的方法:
public class C2 : C1
{
public new C2 GetThis()
{
return this;
}
}
显式隐藏从基类继承的成员
答案 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;类型或注释,因为它允许C3
从C1<C2>
派生,这将导致在运行时抛出异常,因此不会有编译时诊断。