C# 泛型:其中T为A型或B型
在处理泛型时,我们可以C# 泛型:其中T为A型或B型,c#,generics,C#,Generics,在处理泛型时,我们可以其中T:TypeA,TypeB,这意味着T必须同时实现TypeA和TypeB。但是在这个表达式中可以使用OR吗?例如其中T:TypeA | | TypeB?有什么办法可以这样做吗 这是不可能的,也没有什么意义。您永远不能依赖于T拥有某些可用的成员,因为它可以是A或B。所有成员都是可选的 当然可以想象它有这个特性,但它违背了泛型的精神。这只在反射情况下有用。实现这一点的唯一方法是使TypeA和TypeB继承或实现相同的父类或接口。例如: public interface IP
其中T:TypeA,TypeB
,这意味着T必须同时实现TypeA和TypeB。但是在这个表达式中可以使用OR吗?例如其中T:TypeA | | TypeB
?有什么办法可以这样做吗 这是不可能的,也没有什么意义。您永远不能依赖于T
拥有某些可用的成员,因为它可以是A或B。所有成员都是可选的
当然可以想象它有这个特性,但它违背了泛型的精神。这只在反射情况下有用。实现这一点的唯一方法是使
TypeA
和TypeB
继承或实现相同的父类或接口。例如:
public interface IParent
{
}
public class TypeA : IParent
{
//snip
}
public class TypeB : IParent
{
//snip
}
然后你可以用
public class Blah<T> where T: IParent
{
}
公共类Blah,其中T:IParent
{
}
您能使TypeA
和TypeB
继承/实现父类/接口吗?@DavidG:no例如其中T:Label或TextBlock
,并且出于某种原因没有使用控件类。这里可能值得一提的是,Label
和TextBlock
继承自,因此您可以使用它。这种方法的问题是有时类型是密封的,我无法继承它并在其上实现iPart接口。是的,我只是说这是实现你想要的目标的唯一途径。在某种程度上,你总是可以围绕一个封闭的类来完成。@YoryeNathan:理论上是的,但实际上有些情况下你不能。我同意包装某些类型,特别是在处理外部库时,是一种很好的做法,可以防止出现诸如类型过时之类的问题,但有时事情比我们预期的要复杂。