我在用C#实现接口时遇到了麻烦.我有一个接口IPreferencesWrapper<T>,其中T是一个枚举.该接口有一个应该返回可为空的T?Get方法.

界面是这样的:

public interface IPreferencesWrapper<T> where T : Enum
{
    T? Get(string preferenceName);
    void Set(string preferenceName, T value);
}

我正try 在LanguagePferencesWrapper类中实现此接口:

public class LanguagePreferencesWrapper : IPreferencesWrapper<Language>
{
    public Language? Get(string preferenceName)
    {
        var languageString = Preferences.Get(preferenceName, default(string));
        return string.IsNullOrEmpty(languageString) ? null : (Language)Enum.Parse(typeof(Language), languageString);
    }

    public void Set(string preferenceName, Language language)
    {
        Preferences.Set(preferenceName, language.ToString());
    }
}

但是,我收到一个错误,LanguagePferencesWrapper没有实现接口成员IPferencesWrapper.Get(字符串).错误消息指出,由于LanguagePferencesWrapper.Get(字符串)没有匹配的返回类型Language,因此无法实现IPReferencesWrapper.Get(字符串).

但是'Get'的返回类型是'T?",那么为什么它需要返回类型"Language"

推荐答案

目前,您的接口将T约束为Enum或从其派生的类型--但它没有将其约束为值类型.假设您只需要concrete枚举类型的包装器,只需添加struct约束:

public interface IPreferencesWrapper<T> where T : struct, Enum

在这一点上,代码将构建,因为编译器将知道T?意味着Nullable<T>,而不是"可能是T的可空引用类型".(引入可为空的引用类型与泛型有一些"有趣的"交互.)

Csharp相关问答推荐

我无法在Ubuntu下编译使用microsoft.extension.configurationbuilder jsonapi和mono mcs的c#应用程序

为什么在ANTLR4中会出现不匹配的输入错误?""

Polly v8—使用PredicateBuilder重试特定的状态代码

Blazor服务器端的身份验证角色

如何在Parall.ForEachAsync中使用CancerationTokenSource

使用带有WithAppOnly()请求选项的pageIterator

ASP.NET Core MVC将值从视图传递到控制器时出现问题

在C#中过滤Excel文件

如何防止Visual Studio断点以红色突出显示到整行?

异步任务调用程序集

WPF DataGrid文件名列,允许直接输入文本或通过对话框按键浏览

RX操作员使用先前值进行扫描,信号来自值本身

如何返回具有泛型的类?

KeyDown从我的文本框中删除输入,如何停止?

错误:此版本的Visual Studio无法打开以下项目

用MongoDB c#驱动程序删除和返回嵌套数组中的文档

使用免费的DotNet库从Azure函数向Azure文件共享上的现有Excel文件追加行

使用本地公共PEM文件加密字符串,使用Azure KayVault中的私钥解密

在.Net 8 Visual Studio 2022中启用本机AOT发布时发布失败

如何查找Span;T&>是否包含相同顺序的其他Span<;T&>