I have this method that expects MoreOptionsPopupResult as a return.
deleteAttachmentModalViewModel.result is of type MoreOptionsPopupResult, however do I get an error when compiling saying this:
Error CS0738 'PopupProvider' does not implement interface member '
IPopupProvider.ShowDeleteAttachmentPopup()'. 'PopupProvider.ShowDeleteAttachmentPopup()' cannot implement 'IPopupProvider.ShowDeleteAttachmentPopup()' because it does not have the matching return type of 'Task<MoreOptionsPopupResult>'.
In my understanding are both types the same so I am confused why it brings this error.
This is MoreOptionsPopupResult:
namespace SiRiAs.Lib.Helpers {
public enum MoreOptionsPopupResult {
Delete,
Update,
Export
}
}
This is where I get the error message:
public async Task<MoreOptionsPopupResult?> ShowDeleteAttachmentPopup() {
var scope = _serviceProvider.CreateScope();
var deleteAttachmentModalViewModel = scope.ServiceProvider.GetService<DeleteAttachmentModalViewModel>();
var deleteAttachmentPopup = new DeleteAttachmentModal(deleteAttachmentModalViewModel);
var asyncEventAwaiter = new AsyncEventAwaiter<NavigatedToEventArgs>();
App.Current.MainPage.NavigatedTo += asyncEventAwaiter.EventListener;
await App.Current.MainPage.Navigation.PushModalAsync(deleteAttachmentPopup);
await asyncEventAwaiter.Wait();
App.Current.MainPage.NavigatedTo -= asyncEventAwaiter.EventListener;
return (MoreOptionsPopupResult?)deleteAttachmentModalViewModel.result;
}
And this is where result is implemented:
public partial class DeleteAttachmentModalViewModel : ObservableObject {
private readonly IUnitOfWork _unitOfWork;
private readonly IPopupProvider _popupProvider;
public MoreOptionsPopupResult result;
public DeleteAttachmentModalViewModel(IUnitOfWork unitOfWork, IPopupProvider popupProvider) {
_unitOfWork = unitOfWork;
_popupProvider = popupProvider;
}
[ICommand]
public void DeleteButtonPressed() {
result = MoreOptionsPopupResult.Delete;
}
This method works just fine:
public async Task<MoreOptionsPopupResult?> ShowMoreOptionsPopup() {
var popup = new MoreOptionsPopup();
var result = await Shell.Current.CurrentPage.ShowPopupAsync(popup);
return (MoreOptionsPopupResult?)result;
}
Does anyone can think of why the one method works just fine and the other one doesn't like the return type? It seems like they should be the same.
A nullable enum (ie
Nullable<MoreOptionsPopupResult>) is an entirely different type than its corresponding non-nullable enum.This means that
Task<MoreOptionsPopupResult>andTask<MoreOptionsPopupResult?>are completely different, as the compiler is telling you.Take this stripped down version of your code:
This has the same compile-time error you're getting. However, if you remove the
?from theShowDeleteAttachmentPopupmethod in thePopupProviderclass, it will compile correctly.Or, if you want to allow the method to return a nullable enum value, you'll need to modify the interface method's return type.