Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,854
Записей в блоге: 14

Ошибка CS7002: неожиданное использование универсального имени

09.03.2020, 14:20. Показов 1804. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь создать класс, способный хранить информацию как о словах, так и о байтах. Но такой код:
C#
1
MainPack<T> mainPack<T> = new MainPack<T>();
- вообще ввел компилятор в ступор. Поэтому я сделал так:
C#
1
2
private Dictionary<Type, object> mainPack = new Dictionary<Type, object>{ { typeof(Word), new MainPack<Word>() }, { typeof(byte), new MainPack<byte>() } };
private MainPack<T> MainPack_<T>{ get => (T)mainPack[typeof(T)]; set => mainPack[typeof(T)] = value; }
Но такой код тоже не работает, возникает ошибка компиляции из заголовка в сочетании с сообщением об ошибке, что идентификатор T не определен. Попытка вывести справку об этой ошибке ни к чему не приводит. Как сделать параметризованное поле/свойство, чтобы ошибок не возникло?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.03.2020, 14:20
Ответы с готовыми решениями:

Ошибка при использовании IEnumerable<T>: Использование универсального типа IEnumerable требует аргумент типа 1
Доброго Вам времени суток. Помогите решить следующую задачку. На строке IEnumerable&lt;Device&gt; = deviceContext.Devices; возникает...

Ошибка engine.h (использование полного имени в объявлении члена не допускается)
Всем привет ! Прошу помочь с кодом. При описаний класс и публичных переменных столкнулся с такой проблемой. * Использование...

Ошибка "Использование полного имени в объявлении члена не допускается"
Подскажите, пожалуйста, почему в 14 строке кода ошибка &quot;Использование полного имени в объявлении члена не допускается&quot;. Читаю книгу...

33
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16444 / 11287 / 2892
Регистрация: 21.04.2018
Сообщений: 33,182
Записей в блоге: 2
09.03.2020, 16:39
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Так нормально?
Какое общее ограничение вы используете для Word и byte?
Какие общие методы?
Не получится ли у вас, что просто начнёте на каждом шагу делать проверку типов?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,854
Записей в блоге: 14
09.03.2020, 16:42  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Какие общие методы?
BuildFrequencyTable<T>()
WorkWithRareSymbols<T>()
MakeSymbolCodes<T>()
...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16444 / 11287 / 2892
Регистрация: 21.04.2018
Сообщений: 33,182
Записей в блоге: 2
09.03.2020, 16:47
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
BuildFrequencyTable<T>()
WorkWithRareSymbols<T>()
MakeSymbolCodes<T>()
...
Etyuhibosecyu, что в них общего у byte и Word?
Вы понимаете, что у T нет операторов, методов сравнения и т.д.
Общее у byte и Word друг с другом не больше чем общего с object.
Вот и получается, что если вы пишите обобщённый тип или метод для byte и Word - это равносильно, что вы пишите его для object. И он получится априори будет переваривать любой тип.
Это так?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,854
Записей в блоге: 14
09.03.2020, 16:52  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вот и получается, что если вы пишите обобщённый тип или метод для byte и Word - это равносильно, что вы пишите его для object. И он получится априори будет переваривать любой тип.
Я же пишу, значений для любого типа нет в словаре. Поэтому при попытке доступа с любым типом, даже если и не вызовется InvalidOperationException, сам C# выбросит какое-нибудь другое исключение. Поэтому метод не будет переваривать любой тип.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16444 / 11287 / 2892
Регистрация: 21.04.2018
Сообщений: 33,182
Записей в блоге: 2
09.03.2020, 16:58
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Я же пишу, значений для любого типа нет в словаре.
Я вижу, что вы пишите.
Но я не телепат, и понятия не имею, что это означает.

Для того же словаря тип должен реализовывать сравнение по значению.
Byte это реализовывает, а ваш тип Word реализовывает?
Что это за тип такой структура, класс?
Какие метода для работы с ним используются?

И ещё целая куча вопросов, но вы на них не отвечаете.
Похоже даже не понимаете смысл этих вопросов.

А без ответов на эти вопросы не достаточно информации для ответа на ваш вопрос Так нормально?.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,854
Записей в блоге: 14
09.03.2020, 17:03  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для того же словаря тип должен реализовывать сравнение по значению.
Byte это реализовывает, а ваш тип Word реализовывает?
Словарь имеет такой вид:
C#
1
private Dictionary<Type, object> mainPack = new Dictionary<Type, object>{ { typeof(Word), new MainPack<Word>() }, { typeof(byte), new MainPack<byte>() } };
Ключ имеет тип System.Type. Вызывать метод IndexOfValue() я не собираюсь.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что это за тип такой структура, класс?
Полный код:
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
46
47
[DebuggerDisplay("({string_}, {space})")]
public class Word
{
    public string string_;
    public bool space;
 
    public Word()
    {
        string_ = "";
        space = false;
    }
 
    public Word(string new_string, bool new_space)
    {
        string_ = new_string;
        space = new_space;
    }
 
    public override bool Equals(object obj)
    {
        if (obj == null)
        {
            return false;
        }
        Word m = obj as Word;
        if (m == null as Word)
        {
            return false;
        }
        return (string_ == m.string_);
    }
 
    public override int GetHashCode()
    {
        return string_.GetHashCode() ^ space.GetHashCode();
    }
 
    public static bool operator ==(Word _Left, Word _Right)
    {
        return (!(_Right is null) && _Left.string_ == _Right.string_ && _Left.space == _Right.space);
    }
 
    public static bool operator !=(Word _Left, Word _Right)
    {
        return !(_Left == _Right);
    }
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16444 / 11287 / 2892
Регистрация: 21.04.2018
Сообщений: 33,182
Записей в блоге: 2
09.03.2020, 17:13
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Полный код:
Почему используете публичные поля?
У вас предусмотрено изменение публичных полей извне?
Или они единоразово должны устанавливаться в конструкторе?

Зачем вы реализуете операторы == и !=, если потом собираетесь использовать экземпляры через обобщённый тип T у которого нет таких операторов?

Добавлено через 2 минуты
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Словарь имеет такой вид:
Словарь таки ваш может принимать любой тип.
НО зачем он вам нужен?

Добавлено через 1 минуту
Etyuhibosecyu, вы опять, скорее всего, упёрлись в какую-то дикую реализацию.
И вместо того чтобы сделать нормальную реализацию, пытаетесь эту приспособить через миллион костылей к своему коду.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,854
Записей в блоге: 14
09.03.2020, 17:17  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У вас предусмотрено изменение публичных полей извне?
Кажется, где-то предусмотрено, но обыскивать весь код не хочется.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Зачем вы реализуете операторы == и !=, если потом собираетесь использовать экземпляры через обобщённый тип T у которого нет таких операторов?
Потому, что в некоторых местах используются Distinct() и другие подобные методы без обобщенного типа.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
НО зачем он вам нужен?
Для того, чтобы хранить в одном месте одинаковые конструкции как для слов, так и для байтов.

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Etyuhibosecyu, вы опять, скорее всего, упёрлись в какую-то дикую реализацию.
Уже написал:
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Элд Хасп, а как правильно сделать, чтобы код не повторялся два раза?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16444 / 11287 / 2892
Регистрация: 21.04.2018
Сообщений: 33,182
Записей в блоге: 2
09.03.2020, 17:58
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Кажется, где-то предусмотрено, но обыскивать весь код не хочется.
Если вам это явно не надо, то замените свойствами только для чтения.
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Потому, что в некоторых местах используются Distinct() и другие подобные методы без обобщенного типа.
Для Distinct() нужны не операторы сравнения, а метод Equals. Для ХЕШ-таблиц (в том числе словарей) методы Equals и GetHashCode.
Уберите операторы- они только с толку сбивают.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Для того, чтобы хранить в одном месте одинаковые конструкции как для слов, так и для байтов.
Так и будем "в час по чайной ложке"?
А для чего вам хранить в одном месте одинаковые конструкции как для слов, так и для байтов?

Вы хотите от меня ответа, но при этом вместо информации о самой задаче даёте способ каким вы эту задачу реализуете.
Даже без писания, а на фига этот способ, вообще, нужен.

Сейчас опять получится как с BTW.
Вы так и не дали за несколько десятков постов информации, что же вы там делаете. Кроме "это священный код и его нельзя трогать" ничего не сказали.
Мне пришлось самому лазить по инету и искать что к чему.

Хотите нормальных рекомендаций, научитесь нормальным языком полно описывать задачи.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Уже написал:
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Элд Хасп, а как правильно сделать, чтобы код не повторялся два раза?
Я вам так же неоднократно писал.
Для ответа надо понимать смысл это кода.
А пока информации кроме "мне хочется в обобщённом методе обрабатывать только два типа" вы ничего не дали.

Вот пример более-менее типовой реализации неизменяемого типа с реализацией сравнения по значению
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
    [DebuggerDisplay("({Word}, {IsSpace})")]
    public class WordSpace : IEqualityComparer, IEquatable<WordSpace>, IEqualityComparer<WordSpace>
    {
        public string Word { get; }
        public bool IsSpace { get; }
        public int HashCode { get; }
 
        public WordSpace(string word, bool isSpace)
        {
            Word = word ?? "";
            IsSpace = isSpace;
            HashCode = Word.GetHashCode() ^ IsSpace.GetHashCode();
        }
 
        public override bool Equals(object obj)
            => obj is WordSpace wordSpace
            && Equals(wordSpace);
 
        public override int GetHashCode() => HashCode;
 
        public new bool Equals(object x, object y)
            => x!=null && x.Equals(y);
 
        public int GetHashCode(object obj)
            => obj is WordSpace  wordSpace
            ? wordSpace.HashCode
            : obj.GetHashCode();
 
        public bool Equals(WordSpace other)
            => Equals(this, other);
 
        public bool Equals(WordSpace x, WordSpace y)
            => x.HashCode == y.HashCode
            && x.IsSpace == y.IsSpace
            && x.Word == y.Word;
 
        public int GetHashCode(WordSpace wordSpace)
            => wordSpace.HashCode;
 
    }
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
364 / 182 / 41
Регистрация: 13.07.2017
Сообщений: 4,854
Записей в блоге: 14
09.03.2020, 18:03  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы хотите от меня ответа, но при этом вместо информации о самой задаче даёте способ каким вы эту задачу реализуете.
Вот здесь описано, что вообще такое Хаффман для слов. Мне кажется, достаточно подробно. На код можете не смотреть, над ним словесное описание.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16444 / 11287 / 2892
Регистрация: 21.04.2018
Сообщений: 33,182
Записей в блоге: 2
09.03.2020, 18:10
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Вот здесь описано, что вообще такое Хаффман для слов. Мне кажется, достаточно подробно. На код можете не смотреть, над ним словесное описание.
А где в этой теме вы хоть раз упомянули, что это продолжение или вопрос по той теме?

Если брать из той темы метод HuffmanWords, то в нём используется очень много операторов.
А с обобщённым типом вы не сможете использовать операторы.
Вы можете в обобщённом типе использовать только члены интерфейса указанного в ограничителе where типа.
0
Эксперт .NET
 Аватар для Usaga
14819 / 9595 / 1369
Регистрация: 21.01.2016
Сообщений: 36,142
10.03.2020, 07:04
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Я пытаюсь устранить дублирование. Потому что Хаффман для слов делает одно и то же сначала со словами, а затем с байтами.
Ну так не потому ли такое дублирование возникает, что слово - набор байтов и не более?
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
10.03.2020, 09:13
Элд Хасп, мне это не нужно, это был как пример для ТС, что он может сделать, если ему ну уж очень хочется иметь список такой.

p.s. ну и само собой с оговоркой что его затея бред ещё тот.
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16444 / 11287 / 2892
Регистрация: 21.04.2018
Сообщений: 33,182
Записей в блоге: 2
10.03.2020, 11:55
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
Элд Хасп, мне это не нужно, это был как пример для Т
Извиняюсь.

Я случайно нажал на ваш ник.
А обратиться хотел к TC.
Сейчас исправил.

Добавлено через 13 минут
Etyuhibosecyu, дополню Usaga
Цитата Сообщение от Usaga Посмотреть сообщение
Ну так не потому ли такое дублирование возникает, что слово - набор байтов и не более?
Обработка для сжатия именно ТЕКСТА без учёта форматирования в современных реалиях лишена смысла.

Основное сжатие у вас происходит после BTW.
BTW критично к размеру блока.
В общем случае - чем больше в него влезет инфы тем лучше.

Поэтому входную последовательность возможно имеет смысл оценить на энтропию и применимость какого первичного преобразования с целью помещения бОльшей информации в блок BTW.

В контексте текста Юникода это актуально в связи с типовым его видом: в почти всегда в таких текстах второй байт изменчив, а первый почти нет. Поэтому если обратимо заменить Юникоде на какую-то иную последовательность, то можно в теории почти в два раза увеличить загрузку BTW блока.

Применение же вашего "словесного" Хаффман значительно усложняет алгоритм (в том числе необходимость его двойного применения) без получения каких-либо реальных преимуществ.

P.S. И почитайте чуток теории.
А то у меня складывается впечатление, что я в этом разбираюсь больше вашего.
Хотя вы на этом, вроде, специализируетесь, а мои знания ограничиваются случайно прочитанными статьями.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.03.2020, 11:55

VBA, использование флажка для управления столбцами, создание универсального фильтра для листа
Всем привет! Возникла проблема, я не искушенный пользователь Excel, поэтому прошу помощи. У меня не закрепляется UzerForm на листе, это...

Ошибка при создании пустого универсального приложения
Вот какое дело. Решил я на Visual Studio создать пустое универсальное окно, когда я открываю ManePage.xaml у меня выводит , что...

Синтаксическая ошибка в имени файла, имени папки или метке тома
Здравствуйте. Выполняю лаб. работу в cmd, в которой есть задание связанные с командой &quot;Copy&quot;. Появляется вот такое сообщение...

[WinError 123] Синтаксическая ошибка в имени файла, имени папки или метке тома: '<frozen importlib._bootstrap>'
Начал изучать Django и вот моя первая проблема,гуглил как мог не нашел ничего,помогите пожалуйста!!!

Сообщение об ошибке "Синтаксическая ошибка в имени файла, имени папки или метке тома."
Всем доброй ночи, уважаемые форумчане! Делаю лабораторную работу, вот текст примера: D: Cd masm32\text Copy *.* d:\sample1 Dir...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru