Частичный метод MyContactsService.GetContactsAsync() должен иметь часть реализации, поскольку он имеет модификаторы доступности

Я получаю сообщение об ошибке при попытке перестроить проект в режиме выпуска.

Код серьезности Описание Состояние подавления строки файла проекта Ошибка (активная) CS8795 Частичный метод MyContactsService.GetContactsAsync() должен иметь часть реализации, поскольку он имеет модификаторы доступности. ContactsDemo (net8.0-maccatalyst), ContactsDemo (net8.0-windows10.0.19041.0)

Из-за вышеуказанной ошибки я не могу создать APK-файл.

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

namespace ContactsDemo.Service
{
    public partial class MyContactsService
    {
        public partial List<MyContact> GetContactsAsync();
    }
}

Мы добавили классы обслуживания на платформах Android и iOS.

Android-сервис

namespace ContactsDemo.Service
{
    public partial class MyContactsService 
    {
        const string ThumbnailPrefix = "thumb";
        List<MyContact> contactList;
        public partial List<MyContact> GetContactsAsync()
        {
            FillContacts();
            return contactList;
        }

        void FillContacts()
        {
            var uri = ContactsContract.Contacts.ContentUri;

            string[] projection = {
                ContactsContract.Contacts.InterfaceConsts.Id,
                ContactsContract.Contacts.InterfaceConsts.DisplayName,
                ContactsContract.Contacts.InterfaceConsts.PhotoId,
            };


            var ctx = Android.App.Application.Context;

            var cursor = ctx.ApplicationContext.ContentResolver.Query(uri, new string[]
{
                        ContactsContract.Contacts.InterfaceConsts.Id,
                        ContactsContract.Contacts.InterfaceConsts.DisplayName,
                        ContactsContract.Contacts.InterfaceConsts.PhotoThumbnailUri
}, null, null, $"{ContactsContract.Contacts.InterfaceConsts.DisplayName} ASC");

            contactList = new List<MyContact>();

            if (cursor.MoveToFirst())
            {
                do
                {
                    var contact = CreateContact(cursor, ctx);
                    if (!string.IsNullOrWhiteSpace(contact.Name))
                    {
                        contactList.Add(contact);
                    }
                } while (cursor.MoveToNext());
            }
        }

        MyContact CreateContact(ICursor cursor, Context ctx)
        {
            var contactId = GetString(cursor, ContactsContract.Contacts.InterfaceConsts.Id);

            var numbers = GetNumbers(ctx, contactId);
            var emails = GetEmails(ctx, contactId);

            var uri = GetString(cursor, ContactsContract.Contacts.InterfaceConsts.PhotoThumbnailUri);
            string path = null;
            if (!string.IsNullOrEmpty(uri))
            {
                try
                {
                    using (var stream = Android.App.Application.Context.ContentResolver.OpenInputStream(Android.Net.Uri.Parse(uri)))
                    {
                        path = Path.Combine(Path.GetTempPath(), $"{ThumbnailPrefix}-{Guid.NewGuid()}");
                        using (var fstream = new FileStream(path, FileMode.Create))
                        {
                            stream.CopyTo(fstream);
                            fstream.Close();
                        }

                        stream.Close();
                    }


                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex);
                }

            }
            var contact = new MyContact
            {
                Name = GetString(cursor, ContactsContract.Contacts.InterfaceConsts.DisplayName),
                Emails = emails,
                Image = path,
                PhoneNumbers = numbers,
            };

            return contact;
        }

        string[] GetNumbers(Context ctx, string contactId)
        {
            var key = ContactsContract.CommonDataKinds.Phone.Number;

            var cursor = ctx.ApplicationContext.ContentResolver.Query(
                ContactsContract.CommonDataKinds.Phone.ContentUri,
                null,
                ContactsContract.CommonDataKinds.Phone.InterfaceConsts.ContactId + " = ?",
                new[] { contactId },
                null
            );

            return ReadCursorItems(cursor, key)?.ToArray();
        }

        string[] GetEmails(Context ctx, string contactId)
        {
            var key = ContactsContract.CommonDataKinds.Email.InterfaceConsts.Data;

            var cursor = ctx.ApplicationContext.ContentResolver.Query(
                ContactsContract.CommonDataKinds.Email.ContentUri,
                null,
                ContactsContract.CommonDataKinds.Email.InterfaceConsts.ContactId + " = ?",
                new[] { contactId },
                null);

            return ReadCursorItems(cursor, key)?.ToArray();
        }

        IEnumerable<string> ReadCursorItems(ICursor cursor, string key)
        {
            while (cursor.MoveToNext())
            {
                var value = GetString(cursor, key);
                yield return value;
            }

            cursor.Close();
        }

        string GetString(ICursor cursor, string key)
        {
            return cursor.GetString(cursor.GetColumnIndex(key));
        }

    }
}

iOS-сервис

namespace ContactsDemo.Service
{
    public partial class MyContactsService
    {
        const string ThumbnailPrefix = "thumb";

        List<MyContact> contacts = new List<MyContact>();

        public partial List<MyContact> GetContactsAsync()
        {
            NSError error = null;
            var keysToFetch = new[] { CNContactKey.PhoneNumbers, CNContactKey.GivenName, CNContactKey.FamilyName, CNContactKey.EmailAddresses, CNContactKey.ImageDataAvailable, CNContactKey.ThumbnailImageData };

            var request = new CNContactFetchRequest(keysToFetch: keysToFetch);
            request.SortOrder = CNContactSortOrder.GivenName;

            using (var store = new CNContactStore())
            {
                var result = store.EnumerateContacts(request, out error, new CNContactStoreListContactsHandler((CNContact c, ref bool stop) =>
                {

                    string path = null;
                    if (c.ImageDataAvailable)
                    {
                        path = path = Path.Combine(Path.GetTempPath(), $"{ThumbnailPrefix}-{Guid.NewGuid()}");

                        if (!File.Exists(path))
                        {
                            var imageData = c.ThumbnailImageData;
                            imageData?.Save(path, true);


                        }
                    }

                    var contact = new MyContact()
                    {
                        Name = string.IsNullOrEmpty(c.FamilyName) ? c.GivenName : $"{c.GivenName} {c.FamilyName}",
                        Image = path,
                        PhoneNumbers = c.PhoneNumbers?.Select(p => p?.Value?.StringValue).ToArray(),
                        Emails = c.EmailAddresses?.Select(p => p?.Value?.ToString()).ToArray(),

                    };

                    if (!string.IsNullOrWhiteSpace(contact.Name))
                    {
                        contacts.Add(contact);
                    }
                }));
            }

            return contacts;
        }
    }
}

Я могу запустить приложение в режиме отладки с этой ошибкой. Но в режиме выпуска невозможно пересобрать приложение и создать APK-файл.

Я создал демопроект для воспроизведения этой проблемы.

Обновлять

Я обновил текущую и предварительную версию VS до последней, но все равно получаю ту же ошибку. Мои версии VS:

  1. Сообщество Microsoft Visual Studio 2022 (64-разрядная версия) — предварительная версия 17.11.0, предварительная версия 2.0

  2. Сообщество Microsoft Visual Studio 2022 (64-разрядная версия) — текущая версия 17.10.2

Вы можете попробовать обновить VS до последней версии.

Jessie Zhang -MSFT 17.06.2024 10:59

@JessieZhang-MSFT Я использую Microsoft Visual Studio Community 2022 (64-разрядная версия) — предварительная версия 17.11.0, предварительная версия 2.0, и возникает та же ошибка.

Matthew Pans 17.06.2024 11:57

@JessieZhang-MSFT Теперь я попробовал Microsoft Visual Studio Community 2022 (64-разрядная версия) — текущая версия 17.10.2 и та же ошибка.

Matthew Pans 17.06.2024 12:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просмотрев ваш код, я обнаружил, что вы только что реализовали частичную класс MyContactService.cs на платформе Android и iOS.

И TargetFramework, указанный в .csproj, выглядит следующим образом:            

<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>

<TargetFrameworks Condition = "$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks> 

Но принцип компиляции заключается в том, что частичный класс необходимо реализовать для каждого TargetFramework, указанного в .csproj файл.

Итак, вы можете попробовать удалить другие платформы из файла .csproj.

Например, если бы я закомментировал другие платформы, кроме платформ Android и iOS, ошибку можно было бы устранить.       

<PropertyGroup>
            <TargetFrameworks>net8.0-android;net8.0-ios</TargetFrameworks>

            <!--<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>-->

            <!--<TargetFrameworks Condition = "$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks> -->

Другие вопросы по теме