我在 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'
当前,您的接口将
T
限制为 Enum
或从其派生的类型 - 但它并不将其限制为值类型。假设您只想要 concrete 枚举类型的包装器,只需添加 struct
约束:
public interface IPreferencesWrapper<T> where T : struct, Enum
此时将构建代码,因为编译器将知道
T?
表示 Nullable<T>
而不是“可能是 T
的可为空引用类型”。 (可空引用类型的引入与泛型有一些“有趣”的交互。)