0

次のオブジェクトがあります。

public class ItemChange<T> where T : MyBase
{
public DateTime When { get; set; }
public string Who { get; set; }
public T NewState;
public T OldState;
}

のインスタンスをキャストしようとしItemChange<T>ていますItemChange<MyBase>が、キャスト例外が発生しています。

タイプ のオブジェクトをキャストできません。. .

WHat は、ジェネリック型をそのベース カルスにキャストする適切な方法です (上記の where 制約を想定)

4

2 に答える 2

3

C# のクラスは共分散をサポートしていないため、これを直接行うことはできません。ただし、インターフェースでそれを行うことができます:

public interface IItemChange<out T> where T : MyBase
{
    DateTime When { get; set; }
    string Who { get; set; }
    T NewState { get; }
    T OldState { get; }
}

public class ItemChange<T> : IItemChange<T> where T : MyBase
{
    public DateTime When { get; set; }
    public string Who { get; set; }
    public T NewState { get; set; }
    public T OldState { get; set; }
}

次に、次のことができます。

IItemChange<MyBase> base = new ItemChange<MySubclass>();

の一部のサブクラスMySubclassに対してMyBase

于 2012-11-11T15:35:28.770 に答える
0

明示的なキャスト演算子を定義する必要があります。

using System;
using System.Collections.Generic;
using System.Linq;

namespace brosell
{

public class MyBase
{

}



public class ItemChange<T> where T : MyBase
{
    public DateTime When { get; set; }
    public string Who { get; set; }
    public T NewState;
    public T OldState;

    public static explicit operator ItemChange<MyBase>(ItemChange<T> i)
   {
      return new ItemChange<MyBase> { When = i.When, Who = i.Who, NewState = i.NewState, OldState = i.OldState};
   }

}

public class Sub1: MyBase
{

}

public class Sub2: MyBase
{

}

   public class HelloWorld
   {
    public static void Main(string[] args)
    {
        ItemChange<Sub1> item = new ItemChange<Sub1>();


        ItemChange<MyBase> itemCasted = (ItemChange<MyBase>)item;
        }
   } 
}
于 2012-11-11T15:41:45.547 に答える