Anyone know why the following is not working?
C#:
public partial class Default : System.Web.UI.Page
{
SqlConnection connection;
SqlCommand command;
SqlDataReader reader;
protected void Page_Load(object sender, EventArgs e)
{
using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
{
using (command = new SqlCommand("select col1, col2 from table1 where id = @id", connection))
{
command.Parameters.Add("@id", SqlDbType.Int, 3).Value = 1;
connection.Open();
using (reader = command.ExecuteReader())
{
reader.Read();
Div1.InnerHtml = reader.Read["col1"].ToString();
}
}
}
}
}
HTML:
<div runat="server" id="Div1"></div>
Error:
Compiler Error Message: CS0021: Cannot apply indexing with [] to an expression of type 'method group'
Line 32: Div1.InnerHtml = reader.Read["col1"].ToString();
Задача: передать значение (int)candle.MaxVolumePriceInfo.Price для расчета среднего значения за определенный период (Period): (V1+ V2+…..+Vi)/Period
Значение точно определено при помощи метода OnCalculate — это работает. Чтобы обойти ошибку CS0021 применен список List:
…………………….
C# | ||
|
………………………………………….
Скомпилировал, при запуске индикатора в торговой платформе возникает ошибка: индекс находится за пределами диапазона…
Где косяк? В каком направлении копать? Подскажите, пожалуйста.
Ваш пример не знаю куда присоединить. Вообще мне нужно пользоваться определенными сборками, в частности, ATAS.Indicators.dll и прочими из платформы. Только так я смогу запустить там самописный индикатор.
Добавлено через 11 часов 1 минуту
Да, спасибо, удалось избавиться от ошибки CS0021. Теперь компилируется нормально, а при запуске индикатора в торговой платформе возникает ошибка: индекс находится за пределами диапазона… Откуда такой зверь по малоопытности не понимаю… Пока получился вот такой код:
C# | ||
|
Где косяки? Что исправлять? Подскажите, пожалуйста.
- Remove From My Forums
-
Question
-
Compilation Error is:»CS0021: Cannot apply indexing with [] to an expression of type ‘object'».
How can I solve this problem? I tried to change «[]» into «()», but I got another error «CS0118: System.Web.UI.WebControls.DataGridItem.DataItem’ denotes a ‘property’ where a ‘method’ was expected»
Line 74:<ASP:Templatecolumn HeaderText=»Article Title»>
Line 75: <itemTemplate>
Line 76: <a href=articleupdate.aspx?articleid=<%#Container.DataItem[«articleid»]%>&colid=<%#Container.DataItem[«colid»]%>><%#Container.DataItem[«subject»]%></a>
Line 77: </itemTemplate>
Line 78:</ASP:Templatecolumn>
Answers
-
<%# (Container.DataItem as MyClass)[«articleid»]%>
-
That object does not contain an indexer property, you can’t use the [] expression with it.
Anyone know why the following is not working?
C#:
public partial class Default : System.Web.UI.Page
{
SqlConnection connection;
SqlCommand command;
SqlDataReader reader;
protected void Page_Load(object sender, EventArgs e)
{
using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
{
using (command = new SqlCommand("select col1, col2 from table1 where id = @id", connection))
{
command.Parameters.Add("@id", SqlDbType.Int, 3).Value = 1;
connection.Open();
using (reader = command.ExecuteReader())
{
reader.Read();
Div1.InnerHtml = reader.Read["col1"].ToString();
}
}
}
}
}
HTML:
<div runat="server" id="Div1"></div>
Error:
Compiler Error Message: CS0021: Cannot apply indexing with [] to an expression of type 'method group'
Line 32: Div1.InnerHtml = reader.Read["col1"].ToString();
Anyone know why the following is not working?
C#:
public partial class Default : System.Web.UI.Page
{
SqlConnection connection;
SqlCommand command;
SqlDataReader reader;
protected void Page_Load(object sender, EventArgs e)
{
using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
{
using (command = new SqlCommand("select col1, col2 from table1 where id = @id", connection))
{
command.Parameters.Add("@id", SqlDbType.Int, 3).Value = 1;
connection.Open();
using (reader = command.ExecuteReader())
{
reader.Read();
Div1.InnerHtml = reader.Read["col1"].ToString();
}
}
}
}
}
HTML:
<div runat="server" id="Div1"></div>
Error:
Compiler Error Message: CS0021: Cannot apply indexing with [] to an expression of type 'method group'
Line 32: Div1.InnerHtml = reader.Read["col1"].ToString();
Permalink
Cannot retrieve contributors at this time
description | title | ms.date | f1_keywords | helpviewer_keywords | ms.assetid |
---|---|---|---|---|---|
Compiler Error CS0021 |
Compiler Error CS0021 |
09/26/2019 |
CS0021 |
CS0021 |
4eb5fa24-8261-4962-b36a-224be5074217 |
Compiler Error CS0021
Cannot apply indexing with [] to an expression of type ‘type’
An attempt was made to access a value through an indexer on a data type that does not support Indexers.
You may get CS0021 when trying to use an indexer in a C++ assembly. In this case, decorate the C++ class with the DefaultMember
attribute so the C# compiler knows which indexer is the default. The following sample generates CS0021.
Example
The following C++ example compiles to a .dll file. Note that the DefaultMember attribute is commented out in order to generate the error.
// CPP0021.cpp // compile with: /clr /LD using namespace System::Reflection; // Uncomment the following line to resolve //[DefaultMember("myItem")] public ref class MyClassMC { public: property int myItem[int] { int get(int i){ return 5; } void set(int i, int value) {} } };
The following C# example calls the .dll file. It attempts to access the class via an indexer, but because no member was declared as the default indexer, the error is generated. You can address the error by uncommenting the line [DefaultMember("myItem")]
in the .cpp file in the preceding example.
// CS0021.cs // compile with: /reference:CPP0021.dll public class MyClass { public static void Main() { MyClassMC myMC = new MyClassMC(); int j = myMC[1]; // CS0021 } }
Вопрос:
Я продолжаю получать эту ошибку:
не может применять индексирование с [] к выражению типа ‘int’
Это мой код:
using UnityEngine;
using System.Collections.Generic;
public class LearningListScript : MonoBehaviour {
// Use this for initialization
void Start ()
{
List <string> myFavoritePonies= new List <string>();
myFavoritePonies.Add ("Princess Cadence");
myFavoritePonies.Add ("Fluttershy");
myFavoritePonies.Add ("nightmaremoon");
Debug.Log("This List has " + myFavoritePonies.Count + "ponies.");
Debug.Log("This pony name at index 1 is " + myFavoritePonies.Count [1]);
Debug.Log("This pony name at index 2 is " + myFavoritePonies.Count [2]);
Debug.Log("This pony name at index 0 is " + myFavoritePonies.Count [0]);
}
// Update is called once per frame
void Update () {
}
}
Я следую учебнику, но я не понимаю, что я делаю неправильно.
Лучший ответ:
Вы пытаетесь применить индекс массива к целому числу (счетчик массива), поэтому вы получаете эту ошибку. Просто поместите индекс после переменной массива.
Debug.Log("This pony name at index 1 is " + myFavoritePonies.Count [1]);
Debug.Log("This pony name at index 2 is " + myFavoritePonies.Count [2]);
Debug.Log("This pony name at index 0 is " + myFavoritePonies.Count [0]);
Должно быть
Debug.Log("This pony name at index 1 is " + myFavoritePonies[1]);
Debug.Log("This pony name at index 2 is " + myFavoritePonies[2]);
Debug.Log("This pony name at index 0 is " + myFavoritePonies[0]);
Ответ №1
Свойство Count
возвращает количество элементов в списке как int
. Для того, чтобы получить элемент аа конкретный индекс, используйте индексатор ([…]
) на самом списке:
Debug.Log("This pony name at index 1 is " + myFavoritePonies[1]);
Debug.Log("This pony name at index 2 is " + myFavoritePonies[2]);
Debug.Log("This pony name at index 0 is " + myFavoritePonies[0]);
Я хотел попрактиковаться в создании массивов, создав небольшую программу, которая позволяла бы пользователю вводить количество элементов, которые должен иметь массив, а затем создавать массив с количеством элементов, введенных пользователем, и заполнять все элементы числами. Например: если вы наберете 3, будет сгенерировано 3 элемента, элемент 1 заполнится номером 1, а номер 2 — номером 2 и так далее. Хотя каждый раз я получаю конкретную ошибку: CS0021 Невозможно применить индексирование с помощью [] к выражению типа «группа методов» Вот мой код:
static void Main(string[] args)
{
int num;
string getNum;
getNum = Console.ReadLine();
num = Int32.Parse(getNum);
int[] array = new int[num];
Console.WriteLine("Array created with {0} elements.",num);
}
static void Array(int input)
{
int num = 1;
int inum = input;
while(inum >= input)
{
Array[inum] = num;
Console.WriteLine("{0}",input);
Console.WriteLine("{0}", num);
inum = inum - 1;
num = num + 1;
}
Заранее спасибо, если решите мне помочь
В вашей программе Array
— это метод.
Следовательно, строка Array[inum] = num
содержит ошибку, поскольку Array
является методом, и вы не можете применить индексатор ([]
) к методу.
Самый быстрый способ добиться того, чего вы хотите, примерно так:
static int[] Array(int input) // Change return type to return an array of integers
{
var result = new int[input]; // Declare a local variable to hold a new array of size input.
// Change while to basic for loop
for (int i = 0; i < input; i++)
{
result[inum] = i + 1; // set elements of the result array.
Console.WriteLine("{0}",input);
Console.WriteLine("{0}", i);
}
}
В вашем основном методе:
static void Main(string[] args)
{
int num;
string getNum;
getNum = Console.ReadLine();
num = Int32.Parse(getNum);
int[] array = Array(num); // Change this to call the Arrra(int num) method
Console.WriteLine("Array created with {0} elements.",num);
}
Или вы можете использовать простой оператор Linq:
Enumerable.Range(1, input).ToArray();
0
Michal Ciechan
11 Ноя 2017 в 16:47
Хорошо, давайте немного приведем в порядок ваш код и попробуем заставить его делать то, что вы, кажется, хотите:
Начнем с того, что извлечем любую логику из вашего метода Main
и напишем конкретные методы, которые делают небольшие шаги к вашей цели. Помните, что чем меньше размер ваших методов, тем сложнее вам будет написать ошибку. Если вы учитесь, начните с абсурдно малого и становитесь больше по мере обретения уверенности.
Хорошо, есть концепция запроса числа у пользователя, давайте напишем метод, который сделает это, и сделаем его максимально надежным в процессе. Помните, пользователи тупые! Спросите номер, и они напечатают что угодно, кроме:
public static int PromptUserForPositiveInteger(string prompt)
{
int number;
Console.Write(prompt);
var input = Console.ReadLine();
while (!int.TryParse(input, out number) ||
number < 0)
{
Console.Write("Input is not a valid number, try again: ");
input = Console.ReadLine();
}
return number;
}
Итак, этот метод запрашивает у пользователя положительное целое число, и он будет продолжать делать это, пока пользователю не удастся ввести действительное число или не отключит его. В любом случае мы в безопасности. int.TryParse
— безопасный способ извлечь int
из string
; если это возможно, он выдаст вам номер и вернет true
, иначе он вернет false
. Чего он не сделает, так это взорвется вам в лицо в случае неудачи, что int.Parse
с радостью сделает. Избегайте Parse
как чумы, всегда используйте френдлиер TryParse
.
Также стоит упомянуть, что этот метод является деталью реализации , поэтому его private
. Никто за пределами вашего класса не должен его использовать, поэтому не показывайте его.
Также обратите внимание, что мы можем обобщить это, заставив вызывающего абонента указать, как вы хотите побуждать пользователя. Нет причин, по которым вы хотели бы ограничивать этот метод только размерами массивов, возможно, завтра вам понадобится количество бананов, которое вы собираетесь накормить обезьяной! Когда это дешево и легко, обобщайте свой код. Когда обобщение затруднено, не делайте этого, скорее всего, он вам не понадобится и его потраченные впустую усилия.
Теперь следующая задача, которая нам нужна, — это создать массив int
и заполнить его значениями. Значение будет индексом каждого элемента массива. Но подождите, мы сказали, что создадим метод для каждой задачи, какой бы абсурдно маленькой она ни была! Да, я знаю, но до абсурда мало.
private static int[] CreatArrayAndSetValuesToIndex(int size)
{
Debug.Assert(size >= 0);
var array = new int[size];
for (var i = 0; i < size; i++)
{
array[i] = i;
}
return array;
}
CreatArrayAndSetValuesToIndex
может показаться абсурдно длинным именем, но оно говорит вам о том, что именно делает метод . Привыкайте использовать описательные имена и избегайте сокращений. В настоящее время с intellisense нет смысла использовать короткие загадочные имена.
Также обратите внимание на проверку аргумента. Я никогда не буду особо подчеркивать это: всегда проверяйте входные данные для ваших методов! . Если в определенных условиях что-то не должно работать, убедитесь, что вы делаете все возможное, чтобы избежать этих условий. Поскольку метод является частным, достаточно Debug.Assert
. Если бы это было частью публичной поверхности, вам нужно было бы выбросить соответствующее исключение (ArgumentOutOfRange
приходит на ум как подходящее).
И последнее, но не менее важное: давайте напишем себе последний метод, который распечатывает массивы int
, чтобы мы могли убедиться, что наш код работает правильно:
private static void PrintOut(int[] array)
{
Console.WriteLine(string.Join(Environment.NewLine, array);
}
Я воспользовался здесь инструментами, уже доступными во фреймворке. string.Join
— изящный маленький метод, который принимает любой перечислимый объект (массивы — один из них) и создает строку всех его членов с заданным разделителем, в данном случае новую строку.
И теперь все, что осталось, это собрать все воедино:
static void Main(string[] args)
{
var size = PromptUserForPositiveInteger("Enter array size: ");
var array = CreatArrayAndSetValuesToIndex(size);
PrintOutArray(array);
Console.ReadLine();
}
И мы сделали!
0
InBetween
11 Ноя 2017 в 17:09
Кто-нибудь знает, почему следующее не работает?
C #:
public partial class Default : System.Web.UI.Page
{
SqlConnection connection;
SqlCommand command;
SqlDataReader reader;
protected void Page_Load(object sender, EventArgs e)
{
using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
{
using (command = new SqlCommand("select col1, col2 from table1 where id = @id", connection))
{
command.Parameters.Add("@id", SqlDbType.Int, 3).Value = 1;
connection.Open();
using (reader = command.ExecuteReader())
{
reader.Read();
Div1.InnerHtml = reader.Read["col1"].ToString();
}
}
}
}
}
HTML:
<div runat="server" id="Div1"></div>
Ошибка:
Compiler Error Message: CS0021: Cannot apply indexing with [] to an expression of type 'method group'
Line 32: Div1.InnerHtml = reader.Read["col1"].ToString();
2 ответы
Изменить это
Div1.InnerHtml = reader.Read["col1"].ToString();
В это
Div1.InnerHtml = reader["col1"].ToString();
Создан 24 янв.
поскольку вы применяете неправильный индексатор к SqlDataReader. SqlDataReader
ты можешь попробовать вот так
Div1.InnerHtml = reader["your ColumnName"].ToString();
здесь дается полная информация о том, почему возникает это исключение ОШИБКА или cs0021
Создан 24 янв.
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками
c#
asp.net
.net-3.5
asp.net-3.5
or задайте свой вопрос.