引用我自己的类型的最佳方式

jam*_*o00 3 c# generics

abstract class A<T> where T:A<T>
{
    public event Action<T> Event1;
}

class B : A<B>
{
    //has a field called Action<B> Event1;
}
Run Code Online (Sandbox Code Playgroud)

有没有更优雅的方式来做到这一点?我希望基类中的东西(事件等)能够使用子类的类型.

Eri*_*ert 5

您使用的模式实际上并未实现您想要的约束.假设您想要模仿"动物只能与自己的某种东西友好":

abstract class Animal<T> where T : Animal<T>
{
    public abstract void GetFriendly(T t);
}

class Cat : Animal<Cat>
{
    public override void GetFriendly(Cat cat) {}
}
Run Code Online (Sandbox Code Playgroud)

我们是否成功实现了所需的约束?没有.

class EvilDog : Animal<Cat>
{
    public override void GetFriendly(Cat cat) {}
}
Run Code Online (Sandbox Code Playgroud)

现在,一只邪恶的狗可以与任何猫友好,并且与其他邪恶的狗不友好.

您想要的类型约束在C#类型系统中是不可能的.如果需要类型系统强制执行此类约束,请尝试Haskell.

有关详细信息,请参阅我关于此主题的文章:

http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx