ジェネリックスが共分散をサポートしていないことを理解していると思います。最初の例が機能せず、無効なキャスト例外が発生します。すべてがコンパイルされます。ジェネリックの2つの使用の違い(共分散)
しかし、2番目の例はなぜ機能しますか?私はそれが同じものであることだけを見ることができます。
MyClassのは、このようなものです:
public interface IGenericClass<T> { }
public class MyClass : IGenericClass<SomeType>
{
}
は動作しない:
public class SendingEmail<T>
{
IGenericClass<T> abc;
public void Send(IGenericClass<T> _abc)
{
this.abc = _abc;
}
}
用途:また試してみました
var myClass = new MyClass();
SendingEmail<MyClass> sendingEmail = new SendingEmail<MyClass>();
sendingEmail.Send(IGenericClass<MyClass>myClass);
//sendingEmail.Send(myClass); This was wrong
:
それはをコンパイルしたことがないように除去
ワーキング:
class SendingEmail
{
void Send<T>(MyGenericClass<T> abc)
{
}
}
使用法:
SendingEmail sendingEmail = new SendingEmail();
sendingEmail.Send(myclass);
あなたの実用的な例は、 'SendingEmail sendingEmail = new SendingEmail ();' - 'myclass'でなければなりません。あなたの明示的な 'T - > myclass'ではなく' T - > SomeType'を割り当てます。 –
Rob
ジェネリックサポート*安全な共分散* on *インターフェースとデリゲート* *参照型でパラメータ化*。 –
_「すべてがコンパイルされます」_ - 私はどのように見えません。 C#の型安全性は、あなたの正常でない例のような式が 'sendingEmail.Send(myClass)'呼び出しでエラーを伴って正常にコンパイルされないようにするはずです。私はあなたがどのタイプパラメータがどれを混乱させているかについてのコメントに同意しますが、あなたの質問は根本的にはどちらかと言えないようです。これまでのコメントと回答を使用して問題を解決できない場合は、あなたが言うことを行う良い[mcve]が含まれるように問題を修正してください。 –