Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
.NET 4.x

Как вернуть null

06.11.2013, 21:19. Показов 5323. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Все добрый вечер.

пишу такой метод

C#
1
2
3
4
5
6
7
8
9
10
        public TV Find(Predicate<TV> match)
        {
            if (match == null)
            {
                return null;//тут ошибка
            }
            var result = BDictionary.Where(keyValuePair => match(keyValuePair.Value)).Select(keyValuePair => (keyValuePair.Value));
            if (result.Any()) return result.First();
            return null;//тут ошибка
        }
но выдает ошибку в указанных местах, а нужно как то вернуть нулл при условии что метод должен возвращать тип TV
как быть?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.11.2013, 21:19
Ответы с готовыми решениями:

Как вернуть null?
public static async Task&lt;T&gt; MyQQWWEE&lt;T&gt;(this Task&lt;T&gt; task, T valueOnError = null) { T obj; try ...

Как вернуть именно пустой список, а не null?
У меня метод ищет в list'е объекты с введённым именем. Как вернуть ПУСТОЙ список, если совпадения не были найдены? По заданию метод может...

XML. Как мне добится того, чтоб в списке было 1, NULL, NULL, 4?
Есть следующий кусочек XML файла: &lt;root&gt; &lt;row&gt; &lt;cell&gt;&lt;data&gt;1&lt;/data&gt;&lt;/cell&gt; &lt;cell&gt;&lt;data&gt;2&lt;/data&gt;&lt;/cell&gt; ...

16
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.11.2013, 21:46
Измените тип TV с struct на class
1
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
06.11.2013, 21:59  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Измените тип TV с struct на class
TV итак класс.

но вроде трабл решил

заменил строки с ошибкой на
C#
1
 return default(TV);
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.11.2013, 22:25

Не по теме:

hepper, навеяло

C#
1
2
3
4
5
6
7
public static MyClass Check(MyClass obj)
{
   if (obj == null)
      return null;
   else
      return obj; // нам не все равно!
}
2
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
06.11.2013, 22:34  [ТС]
Psilon, прикола не понял, но за попытку спасибо...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.11.2013, 23:38
Цитата Сообщение от hepper Посмотреть сообщение
TV итак класс.
Вы уверены, что не структура?
Иначе ошибку объяснить невозможно.

Если, конечно, метод Find не находится в обобщенном классе и TV не является типом-обобщением.
0
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
07.11.2013, 00:17  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Если, конечно, метод Find не находится в обобщенном классе и TV не является типом-обобщением.
так и есть
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.11.2013, 00:41
Цитата Сообщение от hepper Посмотреть сообщение
так и есть
А, ну тогда конечно только вариант с default

Правда учтите, что если TV будет структурой, то default(TV) вернет просто новый экземпляр структуры.
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.11.2013, 20:28
А если не секрет, какой смысл передавать параметром null? То есть заведомо мы передаём null, чтобы метод вернул null?
Кликните здесь для просмотра всего текста

Добавлено через 51 секунду
Не выдаёт ошибки, что я делаю не так?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace ConsoleApplication1
{
    class Program
    {
        private static Dictionary<TV, TV> BDictionary;
 
        static void Main(string[] args)
        {
            Find(null);
            Console.ReadKey();
        }
 
        public static TV Find(Predicate<TV> match)
        {
            if (match == null)
            {
                return null;//тут ошибка
            }
            var result = BDictionary.Where(keyValuePair => match(keyValuePair.Value)).Select(keyValuePair => (keyValuePair.Value));
            if (result.Any())
                return result.First();
            return null;//тут ошибка
        }
    }
 
}
C#
1
2
3
    class TV
    {
    }
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.11.2013, 20:33
Casper-SC,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    class MyClass<TV>
    {
        private static Dictionary<TV, TV> BDictionary;
 
 
        public static TV Find(Predicate<TV> match)
        {
            if (match == null)
            {
                return null;//тут ошибка
            }
            var result = BDictionary.Where(keyValuePair => match(keyValuePair.Value)).Select(keyValuePair => (keyValuePair.Value));
            if (result.Any())
                return result.First();
            return null;//тут ошибка
        }
    }
ошибка.

Как бы делал я:

C#
1
2
3
4
5
6
7
8
9
10
11
12
    class MyClass<TV>
    {
        private static Dictionary<TV, TV> BDictionary;
 
 
        public static TV Find(Predicate<TV> match)
        {
            if (match == null)
                throw new ArgumentNullException();
            return BDictionary.FirstOrDefault(keyValuePair => match(keyValuePair.Value)).Value;
        }
    }
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.11.2013, 20:40
Всё, я всё понял. Выдаёт ошибку в обобщённом классе, так как ты не добавил:
C#
1
where T: class
Добавлено через 44 секунды
Цитата Сообщение от Psilon Посмотреть сообщение
Как бы делал я:
Я бы тоже так сделал. Нужно сразу и писать код так, чтобы передача null вызывала исключение, иначе потом устанешь искать косяки, почему ничего не работает.

Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    class Something<T> where T: class 
    {
        private static Dictionary<T, T> BDictionary;
 
        public Something()
        {
            
        }
 
        public T Find(Predicate<T> match)
        {
            if (match == null)
            {
                return null;
            }
            var result = BDictionary.Where(keyValuePair => match(keyValuePair.Value)).Select(keyValuePair => (keyValuePair.Value));
            if (result.Any())
                return result.First();
            return null;
        }
    }
Добавлено через 1 минуту
Ну это костыль, лучше генерить исключение.

Добавлено через 1 минуту
Цитата Сообщение от Psilon Посмотреть сообщение
ошибка.
C#
1
where T: class
добавить можно, как уже писал, и как уже писал , лучше так всё же не делать (то есть согласен с тобой).

Добавлено через 1 минуту
Млин, это TV сбивает с толку, я привык всегда в обобщениях использовать Т, а как вижу ТV, кажется, что это какой-то конкретный класс .
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.11.2013, 20:43
Casper-SC, достаточно стандартное обозначение, особенно если обобщенных типов > 1
0
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
10.11.2013, 20:48  [ТС]
ну вообще то я пытаюсь сваять себе обобщенную коллекцию для своих нужд,
типа
C#
1
2
3
4
5
    public class BaseCollection<T, TV>   
{
Dictionary<T, TV> BDictionary;
....
}
и при поиске вываливать эксепшин совсем не комильфо, т.к. отсутствие результата тоже результат... и нулл в моем случае значит что в коллекции искомого элемента нет.

п.с. надо было видать это все сразу написать.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.11.2013, 20:48
Цитата Сообщение от Psilon Посмотреть сообщение
Casper-SC, достаточно стандартное обозначение, особенно если обобщенных типов > 1
Покажи пример, где это может понадобится, вроде бы в одном файле ужились 2 класса с обозначением Т. Мне просто интересно и не понятно.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Something<string> something1 = new Something<string>();
            Something2<string> something2 = new Something2<string>();
            Console.ReadKey();
        }
    }
 
    class Something<T> where T : class
    {
        private static Dictionary<T, T> BDictionary;
 
        public Something()
        {
 
        }
 
        public T Find(Predicate<T> match)
        {
            throw new NotImplementedException();
        }
    }
 
    class Something2<T> where T : class
    {
        private static Dictionary<T, T> BDictionary;
 
        public Something2()
        {
 
        }
 
        public T Find(Predicate<T> match)
        {
            throw new NotImplementedException();
        }
    }
}
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.11.2013, 20:50
Casper-SC, KeyValuePair, например.
hepper,
и при поиске вываливать эксепшин совсем не комильфо
как раз это правильное поведение.
Изучайте
2
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.11.2013, 21:03
Цитата Сообщение от hepper Посмотреть сообщение
и при поиске вываливать эксепшин совсем не комильфо, т.к. отсутствие результата тоже результат... и нулл в моем случае значит что в коллекции искомого элемента нет.
п.с. надо было видать это все сразу написать.
А, теперь всё понял, что к чему.

Добавлено через 5 минут
Я не знаю поможет ли это, но ещё как вариант можно указать, что и второй обобщённый тип это класс:
C#
1
2
3
4
5
    internal class Something<T, TV> 
        where T : class 
        where TV : class
    {
    }
Вообще, проблема решена?

Добавлено через 6 минут
Во-во:
Из этого принципа следует, что «глотать» исключения – это плохо, поскольку вы, фактически, скрываете свои проблемы от глаз вызывающего кода и не даете внешнему коду возможности узнать об этом. Не нужно брать на себя слишком многого, пусть голова болит у вашего «клиента», что делать с «вашим телом» (то есть с исключением), когда вы не справились со своей задачей и решили последовать принципам самурая.

Возвращение null object-а в случае возникновения исключений также является опасной практикой, поскольку вызывающий код просто не сможет определить, является ли пустой объект корректным значением, или же при его получении произошла ошибка:
Но зачастую это всё пропускается мимо ушей. Примерно про это я и говорил (устанешь искать почему ничего не работает, и это я не из воздуха взял).

Мне напомнило, как один чел, который писал серверную часть просто патологически игнорировал мои советы и писал методы передачи/получения данных с сервера просто неадекватнейшим способом, что привело к тому, что я начал путаться, что я там получаю, что передаю, так как надо было запоминать формат передаваемых данных в виде текстовой строки. Ну да, зачем нужны enum(ы), bool(ы). В общем он был из мира php, видимо так его там научили

Так ещё и данные в одном методе были разного типа. Руководствовался он тем, что: А-а-а, за одно и это передадим сразу, чтобы меньше запросов было.
0
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
10.11.2013, 21:04  [ТС]
Цитата Сообщение от Casper-SC Посмотреть сообщение
Вообще, проблема решена?
да, я уже писал - и советчикам выразил благодарность.
Цитата Сообщение от Psilon Посмотреть сообщение
как раз это правильное поведение.
может быть в каких то случаях вы и правы, но в моей ситуации в этом нет необходимости, т.к. значения типа нулл тоже имеют свое значение. а выброс исключения будет приводить к "проскакиванию" элемента. (иначе я бы просто взял стандартную коллекцию, где все описано "как доктор" завещал)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.11.2013, 21:04
Помогаю со студенческими работами здесь

Как вернуть null из пустого массива?
Например, мне нужно использовать статический метод нижу для поиска максимального, желательно использовать тип Interger Пустой массив...

Как быть когда нужно вернуть NULL?
Как быть если нужно чтобы функция в некоторых условиях возвращала NULL, а не возвращаемый тип?

Как вернуть в запросе значение по умолчанию, если SELECT возвращает NULL или ничего не возвращает?
Добрый день! Например я хочу чтобы донное выражение возвращало мне 0 или скажем 1, если результатом выражения rating вернется NULL: ...

Что нужно вернуть, false или null ?
Есть функция которая возвращает значение из сессии. function get($key) { $value = $_SESSION; if(isset($value)) { return...

GetSession(false) должен был вернуть null, а он возвращает сессию
Зравствуйте. Платформа java ee 6, сервер tomcat6. В сервлете прописано: session = getSession(false); if(session != null){ ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru