具体的な質問、なぜあなたはこれを行うことはできません
public class MyGenericClass<T>
{
T obj;
}
理由は、CLRは、単一をコンパイルできるようにするのが好きということですTに指定されている参照タイプで動作するMyGenericClassコードのバージョン
T
をに置き換えることができるので、2番目のケースでこれを行うことができますとほぼ同等、適切なキャストを挿入します。
public class MyGenericClass
{
object obj;
}
しかし、継承のバージョンのために、そのトリックは動作しません。
また、多くの便利な機能は、インターフェイスの制約によって記述することは不可能です。型から継承するときは、メソッドを呼び出すだけでなく、オーバーライドすることもできます。この仮想的な例を考えてみましょう:
class MyBase
{
public virtual void MyVirtual() { }
}
class MyGenericDerived<T> : T
{
public override void MyVirtual()
{
Console.WriteLine("Overridden!");
}
}
MyBase obj = new MyGenericDerived<MyBase>();
obj.MyVirtual();
私はMyGenericDerivedは、それが適用されるものは何でもベースに仮想関数の定義を提供する「ミックスイン」、のようなものがある何をしたいのか。しかし、コンパイラは、TがMyVirtualというメソッドをオーバーライドできるようにする方法を知っていますか?私はTに制約を置く必要があります。どうすればそれをインターフェイスで表現できますか?それは不可能だ。タイプパラメータからの継承を許可すると、インタフェースを使用して制約を記述することは適切な解決策ではありません。それが今日の言語では存在しないもう一つの理由です。これは、あなたが何をしたい達成し
class BaseClass<T>
{
public T property { get; set; }
}
class GenericClass<T> : BaseClass<T>
{
}
class Program
{
static void Main(string[] args)
{
GenericClass<int> l = new GenericClass<int>();
l.property = 10;
}
}
:これについて何
これを実行しようとするあなたの動機は何ですか? –
C#4.0で動的型を待ちます。 –