Я думаю, что я понимаю, что дженерики не поддерживают ковариацию, поэтому первый пример не работает и дает исключение Invalid Cast. Все компилируется.В чем разница между двумя видами использования дженериков (ковариация)
Но почему работает второй пример? Я могу видеть, что это одно и то же.
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
Также пробовал:
Удалены как он никогда не компилируется
Working:
class SendingEmail
{
void Send<T>(MyGenericClass<T> abc)
{
}
}
Использование:
SendingEmail sendingEmail = new SendingEmail();
sendingEmail.Send(myclass);
Ваш нерабочий пример должен быть 'SendingEmail sendEmail = новый SendingEmail ();' - не 'myclass'. Ваш рабочий пример работает правильно, потому что он выводит 'T' правильно, т. Е. Он присваивает' T -> SomeType', а не ваш явный 'T-> myclass' –
Rob
универсальный интерфейс * безопасную ковариацию * на * интерфейсах и делегатах *, когда они * параметрируется ссылочными типами *. –
_ «Все компилируется» _ - Я не понимаю, как это сделать. Безопасность типа C# должна была исключить возможность компиляции выражения, подобного тем, которые содержатся в ваших нерабочих примерах, с ошибкой в вызове 'sendEmail.Send (myClass)'. Я согласен с комментариями о том, что вы запутываете, какие параметры типа есть, но ваш вопрос принципиально не имеет смысла, поскольку в нем есть противоречивая информация. Если вы не можете исправить проблему, используя предоставленные до сих пор комментарии и ответы, исправьте вопрос, чтобы он включал в себя хороший [mcve], который делает то, что вы говорите. –