Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型:其中T为A型或B型_C#_Generics - Fatal编程技术网

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:理论上是的,但实际上有些情况下你不能。我同意包装某些类型,特别是在处理外部库时,是一种很好的做法,可以防止出现诸如类型过时之类的问题,但有时事情比我们预期的要复杂。