Почему делают я получаю “ошибку: … должен быть ссылочным типом” в моем общем методе C#?

В различных таблицах базы данных у меня есть и свойство и столбец значений. Я использую Linq для SQL для доступа к базе данных.

Я пишу метод, который возвращает словарь, содержащий свойства/значения, полученные от данной таблицы базы данных:

private static Dictionary GetProperties(Table table)
{
    Dictionary properties = new Dictionary();

    foreach (var row in table)
    {
        properties[row.Property]=row.Value;
    }

    return properties;
}

После компиляции я добираюсь:

Error 1 The type 'T' must be a reference type in order to use it as parameter 'TEntity' in the generic type or method 'System.Data.Linq.Table'

Я попытался искать это сообщение об ошибке без удачи.

Ища StackOverflow, этот вопрос кажется подобным, хотя относительно списка параметров: Универсальный Список как параметр на методе - хотя параметр все еще не является ссылочным типом в ответах на тот вопрос, также.

Чтение Руководства по программированию C# на MSDN: http://msdn.microsoft.com/en-us/library/twcad0zb (По сравнению с 80) .aspx я вижу их примеры вся передача параметры ссылкой. Однако я не вижу, как передать ссылкой в моем особом случае, так как универсальный тип только для определения универсального типа Таблицы.

Любые указатели очень ценились бы.

PS: Appologies, если это занимает время, чтобы я принял ответ как эта функция, в настоящее время не доступен (я являюсь слепым и использую программу для чтения с экрана).

28
задан Community 23 May 2017 в 12:17
поделиться

2 ответа

Это происходит из-за того, как объявлено Table :

public sealed class Table<TEntity> : IQueryable<TEntity>, 
    IQueryProvider, IEnumerable<TEntity>, ITable, IQueryable, IEnumerable, 
    IListSource
where TEntity : class  // <-- T must be a reference type!

Компилятор жалуется, потому что ваш метод не имеет ограничений на T , что означает, что вы можете принять T , который не соответствует спецификации Table .

Таким образом, ваш метод должен быть по крайней мере таким же строгим в отношении того, что он принимает. Попробуйте вместо этого:

private static Dictionary<string, string> GetProperties<T>(Table<T> table) where T : class
62
ответ дан 28 November 2019 в 02:31
поделиться

Просто добавьте ограничение где T : class к объявлению метода.

Это необходимо, так как Table имеет где TEntity : class ограничение. В противном случае Ваш общий метод может быть вызван с параметром типа структуры, что потребует от CLR инстанцирования Table с этим параметром типа структуры, что нарушит ограничение на Table.

.
22
ответ дан 28 November 2019 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: