我在用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相关问答推荐

静态对象构造顺序

由于POST中的应用程序/JWT,出现不支持的内容类型异常

HttpClient 415不支持的媒体类型错误

如何在C#中转换泛型包装类内部的派生类

当试图限制EF Select 的列时,如何避免重复代码?

关于扩展文件类C#的矛盾

使用System.Text.Json进行序列化时发生StackOverflow异常

实体框架-IsRequired()与OnDelete()

我可以强制System.Text.Json.JsonSerializer以非递归方式工作吗?

C#使用相同内存的多个数组

Linq SELECT的多条指令

如何读取TagHelper属性的文本值?

ASP.NET Core 8 Web API:如何添加版本控制?

项目参考和方法签名问题

如何提高C#中比较大 struct 的性能?

OPC UA标签收集(OPCFoundation NETStandard库,代码更正)

在C#中获取带有泛型的字典的类型名称

如何在C#的Linq查询中将两行合并为一行

当我运行我的ASP.NET Web API时,总是托管在随机端口上,如何避免这种情况?

修改中间件中的响应头时出错