C# 为什么可以';是否将MediaItem转换为SecureMediaItem?
我有以下课程:C# 为什么可以';是否将MediaItem转换为SecureMediaItem?,c#,wcf,C#,Wcf,我有以下课程: [DataContract] public class MediaItem : Video { //used to protect calling api from the incorrectly named video } [DataContract] public class SecureMediaItem : MediaItem { [DataMember] publi
[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;
List dummyItems=new List();
//将媒体项强制转换为安全的媒体项
SecureMediaItem retItem=(SecureMediaItem)dummyItems[mediaId];
//TODO:输入管理员ID
retItem.Token.UserId=1;
retItem.Token.IpAddress=VLSCore2.VlsSecurity.ParseIpFromString(IpAddress);
retItem.Token.UniquePlayerRef=Guid.NewGuid().ToString();
返回项;
然而,我得到一个错误:
无法强制转换类型为的对象
输入“VLSCore2.Entities.Security.Api.MediaItem”
'VLSCore2.Entities.Security.Api.SecureMediaItem'
这只是一个加宽的演员阵容,不是吗?像DataContract属性那样阻止它的东西?不。它与加宽强制转换相反
SecureMediaItem
比MediaItem
更具体。您可以将SecureMediaItem
强制转换为MediaItem
,因为SecureMediaItem
是MediaItem
。另一种方法不起作用,因为MediaItem
不一定是SecureMediaItem
否。它与加宽投射相反SecureMediaItem
比MediaItem
更具体。您可以将SecureMediaItem
强制转换为MediaItem
,因为SecureMediaItem
是MediaItem
。另一种方法是不起作用的,因为MediaItem
不一定是SecureMediaItem
除了@Daniel words之外,可能是更直观地理解这一点,如果你把MediaItem
设计成一个圆圈,扩展它,你会得到一个更大的圆圈SecureMediaItem
。在这种情况下,铸造就像切割你选择的圆。你们不能把更小的圆切成更大的圆
也就是说……除了@Daniel words之外,可能更直观地理解这一点,如果你将MediaItem像一个圆圈一样,扩展它,你会得到一个更大的圆圈
SecureMediaItem
。在这种情况下,铸造就像切割你选择的圆。你们不能把更小的圆切成更大的圆
也就是说…您得到的错误是有意义的:您有一个父项列表,但您正在尝试执行向下转换。标准示例如下所示:
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
由于特定的形状恰好是一个圆,所以将其转换为圆是有效的。但是,对正方形的转换失败,因为虽然正方形是一种形状,但形状不一定是正方形,而圆绝对不是正方形
在您的情况下,您试图将MediaItem视为SecureMediaItem。这类似于将形状视为正方形:当形状为正方形时,它会起作用,但当形状为圆形时,它不会起作用
有一种方法可以解决这个问题:。但是,我不推荐使用它,因为它会对对象层次结构造成快速和松散的影响。您得到的错误是有道理的:您有一个父项列表,但您正试图执行向下转换。标准示例如下所示:
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
由于特定的形状恰好是一个圆,所以将其转换为圆是有效的。但是,对正方形的转换失败,因为虽然正方形是一种形状,但形状不一定是正方形,而圆绝对不是正方形
在您的情况下,您试图将MediaItem视为SecureMediaItem。这类似于将形状视为正方形:当形状为正方形时,它会起作用,但当形状为圆形时,它不会起作用
有一种方法可以解决这个问题:。但是,我不推荐它,因为它会在对象层次结构中快速而松散地播放。对,如果我有一个媒体项集合,并且我想将其放入一个安全的媒体项中,那么我该如何做呢?这是可能的,因为这将是一个更广泛的转换:
var dummyItems=new List();添加(新的SecureMyItem());//顺便说一句:您得到的错误是运行时错误。最有可能的情况是,您试图简单地转换的项目是MediaItem
,而不是SecureMediaItem
。以下代码将导致此错误:var dummyItems=new List();添加(新的MediaItem());var x=(SecureMediaItem)dummyItems[0]代码>。好的,如果我有一个媒体项集合,并且我想将其放入一个安全的媒体项中,那么我该如何做呢?这是可能的,因为这将是一个扩大的强制转换:var dummyItems=new List();添加(新的SecureMyItem());//顺便说一句:您得到的错误是运行时错误。最有可能的情况是,您试图简单地转换的项目是MediaItem
,而不是SecureMediaItem
。以下代码将导致此错误:var dummyItems=new List();添加(新的MediaItem());var x=(SecureMediaItem)dummyItems[0]代码>。