C# 泛型方法将其强制转换为T

C# 泛型方法将其强制转换为T,c#,generics,C#,Generics,我有这门课 class A { public string OnlyOnA { get; private set; } public virtual void Accept<T>(ITaker<T> ia) where T : A { ia.Take((T)this); } } 并实现了该接口 class BTaker : ITaker<B> { public void Take(B b) {

我有这门课

class A
{
    public string OnlyOnA { get; private set; }

    public virtual void Accept<T>(ITaker<T> ia) where T : A
    {
        ia.Take((T)this);
    }
}
并实现了该接口

class BTaker : ITaker<B>
{
    public void Take(B b)
    {
        var v = b.OnlyOnB;
    }
}
b类制作者:ITaker
{
公众作废(B)
{
var v=b.OnlyOnB;
}
}
在Taker类中,我可以灵活地获得正确的A类型和A的子类型。 但我仍然需要在一个我必须这样做(T)的演员

我怎样才能避免演员阵容


非常感谢。

您试图做的是不安全的,因为您可以:

new A().Accept(new BTaker());
为了安全起见,您可以创建一个新接口来指定可接受的
T
类型,例如:

interface IAccept<T> where T : A
{
    void Accept(ITaker<T> taker);
}

class A : IAccept<A>
{
    public string OnlyOnA { get; private set; }

    public virtual void Accept(ITaker<A> ia)
    {
        ia.Take(this);
    }
}
接口IAcept,其中T:A
{
无效接受(ITaker taker);
}
A类:IACEPT
{
公共字符串only{get;private set;}
公共虚拟无效接受(ITaker ia)
{
拿着(这个);
}
}
new A().Accept(new BTaker());
interface IAccept<T> where T : A
{
    void Accept(ITaker<T> taker);
}

class A : IAccept<A>
{
    public string OnlyOnA { get; private set; }

    public virtual void Accept(ITaker<A> ia)
    {
        ia.Take(this);
    }
}