我有一个界面IApiDataWithProperties
。一个类叫做Event
实现了这个接口。
通常我可以投射一个对象IApiDataWithProperties
to Event
(假设它是一个)并且编译器让我这样做没有问题。
在这种情况下,该类型实际上是一个泛型TApiData
其中有一个where
接口限制IApiDataWithProperties
。但是,我无法投射TApiData
to Event
即使有类型限制。我明白了Cannot convert type 'TApiData' to 'Event'
为什么是这样?我错过了什么吗?
public class Event : IApiDataWithProperties, IXmlSerializable
{
// ...
}
public abstract class AbstractBatchPropertyProcessor<TApiData> : AbstractBatchProcessor<TApiData>, IBatchProcessor
where TApiData : IApiDataWithProperties
{
protected virtual string Build(ConcurrentBag<TApiData> batch)
{
foreach (var newItem in batch)
{
if(newItem is Event)
{
// This cast fails: Cannot convert type 'TApiData' to 'Event'
((Event)newItem).Log();
}
}
// ...
}
}
Edit:
我只是想知道为什么这是一个编译错误。
我知道这是一个奇怪的设计,而且您通常不会在通用方法中进行这样的转换。这是我在测试期间想在其中添加一些快速日志记录信息时遇到的事情,这是最省力的路径。
原因是newItem
可以是任何实现的类型IApiDataWithProperties
,所以编译器不能保证它的类型可以转换为Event
。即使你使用检查它is
运算符对编译器来说没有任何意义。作为解决方法,您可以使用双铸:
((Event)(object)newItem).Log();
尽管这有效,但这并不意味着您应该使用它。您不应该在泛型方法中检查类型。相反,尝试使用多态性,添加Log
方法IApiDataWithProperties
或其他一些接口并在您的类型中实现它。然后对该接口有另一个约束,然后您可以调用该方法而无需强制转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)