Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
6 / 3 / 1
Регистрация: 13.01.2011
Сообщений: 33

Применение статического метода выдает ошибку компиляции

14.02.2012, 10:10. Показов 1487. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть примерно такая система:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class StoreItem {
        public int Oid { get; set; }
    }
public class FirstStoreItem : StoreItem{
        public string First { get; set; }
        }
public class SecondStoreItem : StoreItem{
        public string Second { get; set; }
        }
public class DataStore {
        public static int GetUniqOid(List<StoreItem> storeItemList) {
                          int result;
                          ..................
                         return result;
                }
                public List<FirstStoreItem > FirstStoreItemList { get; set; }
                public List<SecondStoreItem > SecondStoreItemList { get; set; }
        }
Далее, пытаюсь применить это:
C#
1
2
3
4
5
6
7
8
9
10
11
                [STAThread]
        static void Main() {
                DataStore dataStore = new DataStore();
                dataStore.FirstStoreItemList = new List<FirstStoreItem >();
                dataStore.SecondStoreItemList = new List<SecondStoreItem >();
 
                //ну и, например, применяю статичный метод 
                int oid1 = DataStore.GetUniqOid(dataStore.FirstStoreItemList);
                //или
                int oid2 = DataStore.GetUniqOid(dataStore.SecondStoreItemList );
        }
Выдает ошибку компиляции "Argument '1': cannot convert from .....List<"мой_проект".FirstStoreItem >' to 'System.Collections.Generic.List<"мой_пр оект".StoreItem>'" для первого применения метода GetUniqOid или соответствующее для второго. Подскажите, пожалуйста, как правильно исправить, чтобы работало. Если необходимо пояснение, то в этом методе генерится, уникальный для переданной колекции объектов реализующих класс StoreItem, Oid.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.02.2012, 10:10
Ответы с готовыми решениями:

Применение strncat в VS 2008 выдает ошибку..
#include &lt;iostream&gt; #include &lt;string&gt; int main() { char *text = &quot;Oshybka odnogo - urok drugomu&quot;, *from = &quot;urok&quot;, *to =...

Выдаёт ошибку на компиляции
На этом участке компиляции выдаёт ошибку: /Создание цикла преобразования const int rowe = 9, columne = 4;//Размер преобразованного...

При компиляции выдает ошибку:
При компиляции выдает ошибку: Unit1.cpp(20): E2015 Ambiguity between '_fastcall IntToStr(unsigned int)' and '_fastcall IntToStr(long)' ...

8
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.02.2012, 10:35
Правильно ругается, т.к. List<FirstStoreItem>, List<SecondStoreItem> и List<StoreItem>- абсолютно разные коллекции, хранящие элементы разных типов. И полиморфизм тут не при чем.

Если в методе GetUniqOid вы не меняете коллекцию, то просто передавайте в него ссылку на IEnumerable<StoreItem> и все будет замечательно.
Правда, сам метод придется модифицировать соответствующим образом для работы с этим интерфейсом.

C#
1
2
3
4
5
                public static int GetUniqOid(IEnumerable<StoreItem> storeItemList) {
                          int result;
                          ..................
                         return result;
                }
Можно, конечно, сделать метод генериком с условием принадлежности:
C#
1
2
3
public static int GetUniqOid<T>(List<T> storeItemList) where T : StoreItem
{
}
Но так лучше не делать, если планируется изменять коллекцию и при этом сохранить специализацию списков.
1
6 / 3 / 1
Регистрация: 13.01.2011
Сообщений: 33
14.02.2012, 10:50  [ТС]
Тип параметра изменил на указанный вами. Метод модифицировал. Но передать туда DataStore.FirstStoreItemList или DataStore.SecondStoreItemList не получается. Сообщение ошибки того же типа "Невозможно конвертировать List<FirstStoreItem > в IEnumerable<StoreItem>". Или вы имеете ввиду, что тип этих свойств в классе DataStore тоже надо изменить?

А вот второй способ работает. А его опасность в чем? Разъясните, пожалуйста (я не совсем понял ваши слова "если планируется изменять коллекцию и при этом сохранить специализацию списков")
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.02.2012, 11:17
Цитата Сообщение от AloneMamont Посмотреть сообщение
Метод модифицировал. Но передать туда DataStore.FirstStoreItemList или DataStore.SecondStoreItemList не получается.
Очень странно. Должно компилироваться.
Если не сложно, скопируйте сюда новую сигнатуру метода.

Цитата Сообщение от AloneMamont Посмотреть сообщение
А его опасность в чем?
Ни в чем, это я немного затупил. Забыл, что вариативность относится к интерфейсам, а не классам.
Так что не обращайте внимания на это замечание. Можете смело пользоваться вторым методом, если он вам подходит.
0
6 / 3 / 1
Регистрация: 13.01.2011
Сообщений: 33
14.02.2012, 11:26  [ТС]
Сигнатура именно такая, как предложили вы
C#
1
2
3
4
5
public static int GetUniqOid(IEnumerable<StoreItem> storeItemList) {
                          int result;
                          ..................
                         return result;
                }
Остальные классы и применение осталось как в изначальном примере.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.02.2012, 12:18
Цитата Сообщение от AloneMamont Посмотреть сообщение
Остальные классы и применение осталось как в изначальном примере.
Не понял.
Вот я скопировал приведенный вами код в пустой консольный проект и заменил сигнатуру метода на предложенную мной.
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
public abstract class StoreItem
{
    public int Oid { get; set; }
}
public class FirstStoreItem : StoreItem
{
    public string First { get; set; }
}
public class SecondStoreItem : StoreItem
{
    public string Second { get; set; }
}
public class DataStore
{
    public static int GetUniqOid(IEnumerable<StoreItem> storeItemList)
    {
        int result = 0;
        return result;
    }
    public List<FirstStoreItem> FirstStoreItemList { get; set; }
    public List<SecondStoreItem> SecondStoreItemList { get; set; }
}
 
static void Main()
{
    DataStore dataStore = new DataStore();
    dataStore.FirstStoreItemList = new List<FirstStoreItem>();
    dataStore.SecondStoreItemList = new List<SecondStoreItem>();
 
    //ну и, например, применяю статичный метод 
    int oid1 = DataStore.GetUniqOid(dataStore.FirstStoreItemList);
    //или
    int oid2 = DataStore.GetUniqOid(dataStore.SecondStoreItemList);
}
Все компилируется и запускается без проблем.
0
6 / 3 / 1
Регистрация: 13.01.2011
Сообщений: 33
14.02.2012, 12:31  [ТС]
Мистика....создал новый консольный проект. Копирую все туда. 4 ошибки компиляции, по две на каждый вызов GetUniqOid(IEnumerable<StoreItem> storeItemList).

Error 1 The best overloaded method match for 'ConsoleTest.DataStore.GetUniqOid(System .Collections.Generic.IEnumerable<Console Test.StoreItem>)' has some invalid arguments D:\ConsoleTest\ConsoleTest\Program.cs
Error 2 Argument '1': cannot convert from 'System.Collections.Generic.List<Console Test.FirstStoreItem>' to 'System.Collections.Generic.IEnumerable< ConsoleTest.StoreItem>' D:\ConsoleTest\ConsoleTest\Program.cs

Ошибки 3 и 4 аналогичны для второго вызова метода.

Код Program.cs
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
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace ConsoleTest {
    public abstract class StoreItem {
        public int Oid { get; set; }
    }
    public class FirstStoreItem : StoreItem {
        public string First { get; set; }
    }
    public class SecondStoreItem : StoreItem {
        public string Second { get; set; }
    }
    public class DataStore {
        public static int GetUniqOid(IEnumerable<StoreItem> storeItemList) {
            int result = 0;
            return result;
        }
        public List<FirstStoreItem> FirstStoreItemList { get; set; }
        public List<SecondStoreItem> SecondStoreItemList { get; set; }
    }
    class Program {
        static void Main(string[] args) {
            DataStore dataStore = new DataStore();
            dataStore.FirstStoreItemList = new List<FirstStoreItem>();
            dataStore.SecondStoreItemList = new List<SecondStoreItem>();
            
            int oid1 = DataStore.GetUniqOid(dataStore.FirstStoreItemList);
            int oid2 = DataStore.GetUniqOid(dataStore.SecondStoreItemList);
        }
    }
}
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.02.2012, 12:43
Стоп.
Какая у вас версия фреймворка?
Вариативность (или вариантность, хз как по-русски) интерфейсов добавлена в четверке, так что если у вас более ранняя версия, то единственный вариант - использовать второй метод.
0
6 / 3 / 1
Регистрация: 13.01.2011
Сообщений: 33
14.02.2012, 12:52  [ТС]
Да, у меня более ранняя версия)). Разобрались. Спасибо за предоставленное ранее решение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.02.2012, 12:52
Помогаю со студенческими работами здесь

Выдаёт ошибку при компиляции
Сделал код #include &lt;iostream&gt; #include &lt;array&gt; int main () { using namespace std; array&lt;int, 3&gt; far cout &lt;&lt; &quot;Enter first...

При компиляции выдает ошибку
Здравствуйте, у меня такая проблема. При компиляции выдает ошибку, не пойму в чем проблема (сори за такой длинный код, только недавно начал...

при компиляции выдает ошибку
Подскажите, такой вопрос, пытаюсь скомпилировать программу, а мне выдает Main.pas(48): File not found: 'GR32.dcu'! Кто знает как исправить?

Выдает ошибку при компиляции
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; typedef struct _SLine { double start; double end; double length() { return...

После компиляции выдает ошибку
После компиляции выдает такое сообщение: ------ Build started: Project: dz2, Configuration: Debug Win32 ------ Compiling... ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru