#c# #types #dictionary #return
#c# #типы #словарь #Возврат
Вопрос:
У меня проблема с некоторым кодом c #, который я пишу, я довольно новичок в c #, и я осмотрелся и не могу найти решение.
У меня есть метод, который возвращает словарь, я установил тип возвращаемого значения object, и, похоже, все в порядке.
public object loopThroughNotificationCountQueries()
{
var countQuery = new Dictionary<string, string>(); ...
... return countQuery;
}
Проблема заключается в основном методе, где я пытаюсь перебирать элементы, возвращаемые из словаря.
Notification notification = new Notification();
var countDictionary = notification.loopThroughNotificationCountQueries();
foreach(KeyValuePair<String, String> entry in countDictionary)
{
...
}
Я получаю сообщение об ошибке «Ошибка 2 оператор foreach не может работать с переменными типа ‘object’, поскольку ‘object’ не содержит общедоступного определения для ‘GetEnumerator'»
Это потому, что я не указываю правильный тип возвращаемого значения для словаря? Или есть другой способ перебора записей в возвращаемом объекте?
Спасибо за твою помощь, Стивен.
Ответ №1:
Посмотрите на объявление вашего метода:
public object loopThroughNotificationCountQueries()
Это означает, что ваше countDictionary
объявление эффективно:
object countDictionary = notification.loopThroughNotificationCountQueries();
… и вы не можете использовать foreach
с object
подобным образом. Самое простое исправление — изменить объявление метода, например, на
// Note case change as well to follow .NET naming conventions
public IDictionary<string, string> LoopThroughNotificationCountQueries()
Комментарии:
1. Спасибо за вашу помощь, как я уже сказал, я новичок в C # и я не знал, что методы могут быть объявлены как словарь.
Ответ №2:
Использовать
public Dictionary<string, string> loopThroughNotificationCountQueries() { ... }
или объясните, почему это невозможно.
Комментарии:
1. @Vlad — Какой модификатор доступа? Вы имеете в виду возвращаемый тип?
2. @Oded Модификаторы доступа
3. @Vlad — Я знаю, что такое модификаторы доступа. Я просто не понимаю, почему вы думаете, что они имеют отношение к ответу.
4. общедоступный идентификатор был бы лучше. (вместо словаря)
5. @Oded, По общему признанию, с моей стороны это не очень stackoverflowy, но я нашел опечатку Хенка забавной. Ответ тоже верен, поэтому я придерживаюсь своего 1.
Ответ №3:
public IDictionary<string, string> loopThroughNotificationCountQueries()
{
var countQuery = new Dictionary<string, string>(); ...
... return countQuery;
}
Ответ №4:
Есть ли причина, по которой вы не можете использовать сигнатуру вашего метода, как показано ниже? Вы всегда возвращаете словарь со строковым типом ключа и строковым типом данных?
public Dictionary<string, string> loopThroughNotificationCountQueries()
Ответ №5:
ваши loopThroughNotificationCountQueries
возвраты object
. Верните его Dictionary<string, string>
, изменив его подпись.
public Dictionary<string, string> loopThroughNotificationCountQueries()
{
var countQuery = new Dictionary<string, string>(); ...
... return countQuery;
}
Ответ №6:
да, предполагается, что это:
public IDictionary<string, string> loopThroughNotificationCountQueries()
{
}
Вы можете взаимодействовать только с объектами IEnumerable<T>
поэтому, если по какой-то причине вы не можете изменить loopThroughNotificationCountQueries
, сначала приведите объект к IDictionary<string, string>
.
Ответ №7:
да, это потому, что вы не указываете возвращаемый тип.
две возможности:
тем лучше: вы указываете возвращаемый тип в Dictionary
чем хуже: вы приводите объект к словарю в вызывающем методе
Комментарии:
1. Он действительно указывает возвращаемый тип —
object
.2. ha ha. как я пишу в аннотации к книге: «это книга», да, это правильно
3. Если бы здесь не нужно было указывать тип возвращаемого значения, он бы использовал
void
.4. void будет означать, что объявление метода не имеет возвращаемого типа. но у этого есть один. это просто неверно указано. 😉
Ответ №8:
Вы не должны возвращать словарь в непубличном методе, он раскрывает тип и все его методы и свойства, если они вам не нужны, а в большинстве случаев они вам не нужны, не делайте этого. Включите FxCop, и он будет выть на вас за это
Есть много способов обойти это, вероятность того, что вы захотите сделать какой-то класс.someDictionary.Add(«имя», «значение») невелики, вероятность того, что это разумная реализация, практически отсутствует.
В общем, я просто хочу, чтобы мой класс имел закрытый член типа Dictionary и предоставлял несколько методов, например
public IEnumerable<String> Names { get { return _myDictionary.Keys;} }
и т.д.
Если я делаю это часто, делегирую простому классу и продолжаю это делать.