C # -Arra Covariance в общих классах
-
20-08-2019 - |
Вопрос
Я знаю, что C # поддерживает ковариацию в таких массивах:
object[] array = new string[3];
Но я получаю сообщение об ошибке при попытке скомпилировать приведенный ниже код
class Dummy<K,T> where T:K
{
public void foo()
{
K[] arr = new T[4];
}
}
Там написано " Невозможно неявно преобразовать тип 'T []' в 'K []' "
Почему я получаю эту ошибку ??? Р>
Решение
Вы должны указать, что T и K являются ссылочными типами. Ковариация массива работает только со ссылочными типами. Измените объявление на:
class Dummy<K,T> where T : class, K
и все работает отлично. Вам не нужно указывать, что K является ссылочным типом, потому что если T является ссылочным типом, и он является производным от K или реализует его, то K также должен быть ссылочным типом. (По крайней мере, я предполагаю, что это и есть причина. Не мешало бы добавить where K : class
также для ясности.)
Другие советы
тип T должен поддерживать неявное преобразование в K. Например.
T a = new T (); K b = a;
должен быть действительным.