使用可空引用类型时发生 C# 接口实现错误

问题描述 投票:0回答:1

我在 C# 中实现接口时遇到问题。我有一个接口

IPreferencesWrapper<T>
,其中
T
是一个枚举。该接口有一个
Get
方法,该方法应返回可空的
T?

这是界面:

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

我正在尝试在 LanguagePreferencesWrapper 类中实现此接口:

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());
    }
}

但是,我收到一个错误,指出 LanguagePreferencesWrapper 未实现接口成员 IPreferencesWrapper.Get(string)。错误消息显示“LanguagePreferencesWrapper.Get(string)”无法实现“IPreferencesWrapper.Get(string)”,因为它没有匹配的“Language”返回类型。

但是'Get'的返回类型是'T?',那么为什么它期望返回类型'Language'

c# enums interface nullable-reference-types
1个回答
0
投票

当前,您的接口将

T
限制为
Enum
或从其派生的类型 - 但它并不将其限制为值类型。假设您只想要 concrete 枚举类型的包装器,只需添加
struct
约束:

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

此时将构建代码,因为编译器将知道

T?
表示
Nullable<T>
而不是“可能是
T
的可为空引用类型”。 (可空引用类型的引入与泛型有一些“有趣”的交互。)

© www.soinside.com 2019 - 2024. All rights reserved.