我有课程:
[DataContract]
public class MediaItem : Video
{
//used to protect calling api from the incorrectly named video
}
[DataContract]
public class SecureMediaItem : MediaItem
{
[DataMember]
public PlayerEmbedToken Token;
}
然后我有以下代码:
List<MediaItem> dummyItems = new List<MediaItem>();
//cast the media item into a secure media item
SecureMediaItem retItem = (SecureMediaItem)dummyItems[mediaId];
//TODO: put in the Admin ID
retItem.Token.UserId = 1;
retItem.Token.IpAddress = VLSCore2.VlsSecurity.ParseIpFromString(ipAddress);
retItem.Token.UniquePlayerRef = Guid.NewGuid().ToString();
return retItem;
但是我收到了错误:
无法投射类型的对象 输入'VLSCore2.Entities.Security.Api.MediaItem' 'VLSCore2.Entities.Security.Api.SecureMediaItem'。
这只是一个广泛的演员,不是吗?像DataContract属性那样停止它的东西?
答案 0 :(得分:5)
没有。这与扩大的演员阵营相反。 SecureMediaItem
比MediaItem
更具体。您可以将SecureMediaItem
投射到MediaItem
,因为SecureMediaItem
是MediaItem
。反过来说不起作用,因为MediaItem
不一定是SecureMediaItem
。
答案 1 :(得分:0)
除了@Daniel的话,可能会更直观地理解这一点,如果你像MediaItem
一样想象一个圆圈,那么扩展它就会得到一个更大的圆圈SecureMediaItem
。在这种情况下,施放就像切割您选择的圆圈一样。您无法对较小的圈进行切片以获得更大一个。
那是......
答案 2 :(得分:0)
你得到的错误是有道理的:你有一个父项列表,但你正在尝试执行向下转换。标准的例子是这样的:
public class Shape { ... }
public class Circle : Shape
{
public void FillCircle();
}
public class Square : Shape
{
public void FillSquare();
}
...
Shape s = new Circle();
s.FillCircle(); // won't compile
Circle c = (Circle) s;
c.FillCircle(); // dangerous, but works
Square sq = (Square) s; // runtime error
投射到圆形是有效的,因为特定形状恰好是圆形。但是,对Square的强制转换失败是因为Square是Shape,Shape不一定是Square而Circle绝对不是Square。
在您的情况下,您正在尝试将MediaItem视为SecureMediaItem。这类似于将形状视为方形:当形状为正方形时,它将起作用,但当它是圆形时,它将起作用。
有一种解决方法:define your own explicit conversion operator。但是,我不推荐它,因为它与你的对象层次结构一起快速而松散。