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]