#c# #xamarin.forms
#c# #xamarin.forms
Вопрос:
Я надеюсь, что кто-нибудь сможет помочь, поскольку я новичок в разработке xamarin. Я могу подтвердить, что если я жестко закодирую переменную в ProductID, код будет работать правильно.
Полная ошибка, которую я получаю, заключается в следующем; «Ошибка состояния подавления строки файла проекта описания кода серьезности CS1061 ‘object’ не содержит определения для ‘Product_ID’ и не удалось найти доступный метод расширения ‘Product_ID’, принимающий первый аргумент типа ‘object’ (вам не хватает директивы using или ссылки на сборку?)»
Метод, в котором я получаю эту ошибку, является;
private async void ListStockTakeServices_ItemTapped(object sender, ItemTappedEventArgs e)
{
int ProductID = e.Item?.Product_ID;
await Navigation.PushModalAsync(new ListViewPage(ProductID));
}
Ниже приведено изображение, которое (насколько я вижу) доказывает, что на самом деле существует переменная «Product_ID»
Окно локальных данных Visual Studio
Заранее большое спасибо
Ответ №1:
это базовый C #. Вам необходимо привести object
к правильному типу, чтобы получить доступ к его свойствам
int ProductID = ((Overviews)e.Item).Product_ID;
Комментарии:
1. Это устранило мою проблему, большое вам спасибо
2. Плохой вопрос, отличный ответ.
Ответ №2:
Что касается «почему», это приведение обязательно.
Мы можем наблюдать разницу между тем, что есть во время компиляции, и тем, что есть во время выполнения.
Предупреждение:
слово ‘object’ используется ниже для обозначения object
типа или как синоним ‘instance’, ‘value’, ‘the thingy’
Во время компиляции компилятор просматривает типы объектов, и это то, с чем он работает. Он не может определить, что это будет Overviews
объект при запуске программы. Все, что он знает, это то, что e.Item
имеет тип object
. Это своего рода декларация, в которой говорится: «это будет просто object
«. Поскольку у object
него нет Product_ID
свойства, компилятор протестует, говоря: ‘object’ не содержит определения для ‘Product_ID’
Вы можете увидеть объявленный тип e.Items
, наведя указатель мыши на e.Items
или в документации для ItemTappedEventArgs.Item.
То, что вы видели во время выполнения, является фактическим параметром (в отличие от формального параметра в объявлении метода), в данном случае Overviews
объектом. Когда вы пишете свою программу, вы знаете, что это Overviews
объект, которого нет у компилятора. Поскольку у нас больше знаний о том, что происходит в программе, мы иногда «исправляем» предположения компилятора. В этом случае мы сообщаем компилятору, что e.Item
это не просто object
объект, а Overviews
объект.
Комментарии:
1. Спасибо, что объяснили это подробнее