MediaItemをSecureMediaItemにキャストできないのはなぜですか?

c# wcf
MediaItemをSecureMediaItemにキャストできないのはなぜですか?

私にはクラスがあります:

    [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 dummyItems = new List();

 //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  0


ベストアンサー

No. 拡大キャストの反対です。 「SecureMediaItem」は「MediaItem」よりも具体的です。 「SecureMediaItem」は「MediaItem」なので、「SecureMediaItem」を「MediaItem」にキャストできます。 「MediaItem」は必ずしも「SecureMediaItem」ではないため、他の方法は機能しません。

5


@Danielの言葉に加えて、これをより直感的に理解できるかもしれませんが、「MediaItem」を円のように想像し、それを拡大すると、より大きな円「SecureMediaItem」が得られます。 この場合のキャストは、選択した円をスライスするようなものです。 _smaller_円をスライスして_bigger_円を取得することはできません。

あれは…​

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はShapeですが、Shapeは必ずしもSquareではなく、Circleは間違いなくSquareではないため、Squareへのキャストは失敗します。

あなたのケースでは、MediaItemをSecureMediaItemのように扱っています。 これは、ShapeをSquareのように扱うことに似ています。ShapeがSquareの場合は機能しますが、Circleの場合は機能しません。

これを回避する方法があります:http://msdn.microsoft.com/en-us/library/xhbhezf4.aspx [独自の明示的な変換演算子を定義]。 ただし、オブジェクト階層で高速かつ緩やかに再生されるため、お勧めしません。

0


タイトルとURLをコピーしました