C # -Arra Covariance в общих классах - PullRequest
6 голосов
/ 24 января 2009

Я знаю, что C # поддерживает ковариацию в таких массивах:

object[] array = new string[3];

Но я получаю сообщение об ошибке при попытке скомпилировать приведенный ниже код

class Dummy<K,T> where T:K
{
    public void foo()
    {
        K[] arr = new T[4];
    }
}

В нем говорится: «Не удается неявно преобразовать тип« T [] »в« K [] »»

Почему я получаю эту ошибку ???

Ответы [ 2 ]

12 голосов
/ 24 января 2009

Вы должны указать, что T и K являются ссылочными типами. Ковариация массива работает только со ссылочными типами. Изменить объявление на:

class Dummy<K,T> where T : class, K

и работает нормально. Вам не нужно указывать, что K является ссылочным типом, потому что если T является ссылочным типом, и он является производным от K или реализует его, то K также должен быть ссылочным типом. (По крайней мере, я предполагаю, что это и есть причина. Не мешало бы добавить where K : class для ясности.)

0 голосов
/ 24 января 2009

тип T должен поддерживать неявное преобразование в K. Например,

T a = новый T (); K b = a;

должен быть действительным.

...