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);
}
}