Параметр C # Generic Class Type (не может неявно конвертировать)

<Сильный> Сценарий:

class A { }

class B : A { }

class C where T: A { }

<Сильный> Вопрос

Why cant C = C when B is a subclass of A? it throws the "cannot implicitly convert" error

благодаря

--UPDATE-- can i create an implicit method for that C would recognize C?

2
См. stackoverflow.com/questions/674715/net-casting-generic- список и stackoverflow. ком/вопросы/1133356/& hellip; . Ключевые слова, которые вы ищете, - это ковариация и контравариантность :)
добавлено автор RB., источник
См. stackoverflow.com/questions/674715/net-casting-generic- список и stackoverflow. ком/вопросы/1133356/& hellip; . Ключевые слова, которые вы ищете, - это ковариация и контравариантность :)
добавлено автор RB., источник
Что вы имеете в виду с C = C?
добавлено автор Michel Keijzers, источник
Пожалуйста, перечитайте свой вопрос. Что означает "Почему Cant C = C" ? Предоставьте компиляционный фрагмент кода, который позволит нам воспроизвести вашу проблему.
добавлено автор Tim Schmelter, источник
вы также можете найти информацию по здесь
добавлено автор Default, источник
вы также можете найти информацию по здесь
добавлено автор Default, источник
Бит длинного чтения, но ваш ответ здесь Это связано с тем, что C# не поддерживает ковариацию для дженериков.
добавлено автор Karthik T, источник
Бит длинного чтения, но ваш ответ здесь Это связано с тем, что C# не поддерживает ковариацию для дженериков.
добавлено автор Karthik T, источник
Вам не нужны эти скобки для запуска: class C , где T: A {}
добавлено автор Codesleuth, источник
Вам не нужны эти скобки для запуска: class C , где T: A {}
добавлено автор Codesleuth, источник
извините забыл добавить блоки кода
добавлено автор Milo Cabs, источник
извините забыл добавить блоки кода
добавлено автор Milo Cabs, источник

8 ответы

Используйте совместный вариант , если вам нужно это сделать, и потому что co-variant работает только с интерфейсом и делегатом , поэтому определите интерфейс с волшебным словом out вместо класса:

interface IC where T : A
{
}

Таким образом, вы можете назначить, как хотите:

class CA : IC
{}

class CB : IC
{ }

IC x = new CA();
IC y = new CB();

x = y;

Используйте совместный вариант , если вам нужно это сделать, и потому что co-variant работает только с интерфейсом и делегатом , поэтому определите интерфейс с волшебным словом out вместо класса:

interface IC where T : A
{
}

Таким образом, вы можете назначить, как хотите:

class CA : IC
{}

class CB : IC
{ }

IC x = new CA();
IC y = new CB();

x = y;

What you are asking for is Covariance and Contravariance in Generics which is only applicaple for interfaces and delegates. You can check this

You can do the following in Framework >= 4:

interface IC where T : A

class C : IC  where T : A

IC ica = new C();

For your case you should extract an interface for class C

What you are asking for is Covariance and Contravariance in Generics which is only applicaple for interfaces and delegates. You can check this

You can do the following in Framework >= 4:

interface IC where T : A

class C : IC  where T : A

IC ica = new C();

For your case you should extract an interface for class C

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot