Error cs1503 argument 1 cannot convert from string to int

Ошибка "error CS1503". Преобразование из string в T C#, .NET 3.x Решение и ответ на вопрос 1184092

nicknight

0 / 0 / 0

Регистрация: 11.10.2012

Сообщений: 9

1

.NET 3.x

21.05.2014, 22:36. Показов 5939. Ответов 11

Метки нет (Все метки)


Всем привет. Собственно, сабж. Вылезает ошибка error CS1503 в 7 строчке:

C#
1
2
3
4
5
6
7
8
9
10
11
12
BinList = new MyStream<T>(BinListFileName, FileMode.Create);
Form4<T> list = (Form4<T>)(this.ActiveMdiChild);
T yo;
if (yo is string) {
   Form5 addString = new Form5();
   if (addString.ShowDialog() == DialogResult.OK)
       BinList.insertElem(addString.Data);
   }
 
public class MyStream<T> : Stream
   public void insertElem(T s)
{}

До этого все выполнялось, и string, который возвращает addString.Data, спокойно преобразовывался в T, пока я не заставил формы работать с неопределенными типами. Либо как-то не так заставил

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Psilon

Master of Orion

Эксперт .NET

6094 / 4950 / 905

Регистрация: 10.07.2011

Сообщений: 14,522

Записей в блоге: 5

22.05.2014, 00:10

2

nicknight, потому что компилятор не умеет преобразовывать произвольный тип в строку?..

C#
1
BinList.insertElem(addString.Data.ToString());

костыль, но будет работать.



0



0 / 0 / 0

Регистрация: 11.10.2012

Сообщений: 9

22.05.2014, 07:41

 [ТС]

3

Psilon, так мне нужно наоборот — string в произвольный тип. Не работает костыль.



0



647 / 582 / 170

Регистрация: 17.07.2012

Сообщений: 1,649

Записей в блоге: 1

22.05.2014, 08:29

4

Так что есть Т то у вас когда вы ошибку получаете?



0



nicknight

0 / 0 / 0

Регистрация: 11.10.2012

Сообщений: 9

22.05.2014, 09:24

 [ТС]

5

Cupko,
В данном случае, string. Но проверка же еще в

C#
1
if (yo is string)

проходит.



0



Psilon

Master of Orion

Эксперт .NET

6094 / 4950 / 905

Регистрация: 10.07.2011

Сообщений: 14,522

Записей в блоге: 5

22.05.2014, 10:54

6

nicknight, ну тогда делай так:

C#
1
2
3
4
5
6
7
8
9
10
BinList = new MyStream<string>(BinListFileName, FileMode.Create);
Form4<string> list = (Form4<string>)(this.ActiveMdiChild);
 
   Form5 addString = new Form5();
   if (addString.ShowDialog() == DialogResult.OK)
       BinList.insertElem(addString.Data);
 
public class MyStream<T> : Stream
   public void insertElem(T s)
{}

т.к. на запись if (yo is string) компилятору вообще плевать.



0



Cupko

647 / 582 / 170

Регистрация: 17.07.2012

Сообщений: 1,649

Записей в блоге: 1

22.05.2014, 11:00

7

Я не понимаю ничего…

C#
1
2
T yo;
if (yo is string)

yo — пустая ссылка, yo is string что возвратит? это вообще компилиться будет?



0



0 / 0 / 0

Регистрация: 11.10.2012

Сообщений: 9

22.05.2014, 11:26

 [ТС]

8

Psilon, так и было до этого. Но я хочу чтобы не только со стрингами работало.

Добавлено через 2 минуты
Cupko, не важно, что она пустая, у нее тип — Т, а yo is string, как я понимаю, проверит на соответствие типу.
is (Справочник по C#)



0



kolorotur

Эксперт .NET

16930 / 12507 / 3286

Регистрация: 17.09.2011

Сообщений: 20,744

22.05.2014, 11:52

9

Цитата
Сообщение от nicknight
Посмотреть сообщение

C#
1
BinList.insertElem(addString.Data);

Я так понимаю, addString.Data — это строка.
В этом случае компилятор вполне резонно предполагает, что вы где-нибудь в коде можете создать MyStream<int>, а потом попытаться передать туда string.
На что и ругается.



0



0 / 0 / 0

Регистрация: 11.10.2012

Сообщений: 9

23.05.2014, 10:33

 [ТС]

10

Видимо, придется как-то по-другому кумекать. Буду разбираться с преподом. Всем спасибо!



0



647 / 582 / 170

Регистрация: 17.07.2012

Сообщений: 1,649

Записей в блоге: 1

23.05.2014, 12:53

11

А если Т стрингой ограничить?



0



Master of Orion

Эксперт .NET

6094 / 4950 / 905

Регистрация: 10.07.2011

Сообщений: 14,522

Записей в блоге: 5

23.05.2014, 15:43

12

Cupko, то смысл в нем?..



0



  • Remove From My Forums
  • Question

  • Hello

    I’ve got a project that is giving me build errors in VS2017, however it’s been building without errors in 2013

    In this project C# I am using a vendor DLL that has a function signature of

    VendorMethod(DoubleWaveform, int, int[*], double, VendorAssembly.DesiredUnits, double, double, double, Vendor.Assembly.UnitLabels, vendorAssemblyComplexSpectrum, vendorAssembly.Element[*], int, string)

    The errors are

    Argument 3 cannot convert from int[] to int[*]    \ my declaration is int[] data = {1,2,3,4,5 };

    Arugment 11 cannot convert from out vendorAssembly.Element[]  to  out vendorAssembly.Element[*] 
    \my declaration is vendorAssembly.Element[] Elements;

    This builds without errors in 2013, is there something within 2017 properties that I can change?

Прежде чем ответить, я снова и снова проверял свой код, а также около часа искал похожий ответ. Компилятор продолжает выдавать ошибку CS1503, я не совсем уверен, как это исправить. Это строки 36 и 37, и я прокомментировал строки с ошибками 36 и 37. Он предназначен для базы данных, которая должна искать номерной знак и выводить другие данные в таблицу.

public partial class Login : Form
{
    string connectionString = @"Data Source=(LocalDB)MSSQLLocalDB;AttachDbFilename=J:Plate ReaderDBInfoDB.mdf;Integrated Security=True;Connect Timeout=30";
    SqlDataReader mdr;

    public Login()
    {
        InitializeComponent();
    }

    private void btnSearch_Click(object sender, EventArgs e)
    {
        using (SqlConnection sqlCon = new SqlConnection(connectionString))
        {
            sqlCon.Open();
            string selectQuery = "SELECT * From Plate WHERE Plate='" + txtPlate.Text;
            SqlCommand command = new SqlCommand(selectQuery, sqlCon);

            mdr = command.ExecuteReader();

            if (mdr.Read())
            {
                labelName.Text = mdr.GetString("Name");  //Right here
                labelWanted.Text = mdr.GetInt32("Bounty").ToString(); //and here
            }
            else
            {
                MessageBox.Show("No Data For This Plate");
            }
        }
    }
}

3 ответа

Лучший ответ

Как объяснено в комментариях, GetString также GetInt32 требует параметр типа integer. Это целое число — позиция поля в списке выбора полей. Если вы не хотите использовать позицию, вы можете написать

 labelName.Text = mdr.GetString(mdr.GetOrdinal("Name")); 

И эту простую строку можно легко преобразовать в метод расширения, добавив метод в статический класс, чей код

public static class ReaderExtensions
{
     public static string GetString(this SqlDataReader source, string fieldName)
     {
         return source.GetString(source.GetOrdinal(fieldName));
     }
}

И это, наконец, позволяет писать

string labelText = mdr.GetString("Name");

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


4

Steve
29 Дек 2018 в 19:33

GetInt32 ожидает параметр ‘int’.

Вы передаете в строке.

Вам необходимо отправить в порядковую позицию ваших столбцов.

Используйте это вместо:

mdr.GetInt32(mdr.GetOrdinal("Name"));

Возможно, вы захотите использовать микро ORM, например Dapper, чтобы упростить процесс.


1

KSK
29 Дек 2018 в 19:46

Понравилась статья? Поделить с друзьями:
  • Error cs0034 operator is ambiguous on operands of type vector3 and vector2
  • Error cs0030 cannot convert type string to int
  • Error cs0029 unity
  • Error cs0029 cannot implicitly convert type void to string
  • Error cs0029 cannot implicitly convert type void to int