C# 扩展方法中的可空嵌套类型
Nullable nested type in extension method in C#
我正在尝试为 IDictionary
- GetValue
制作一个超酷的扩展,如果未设置默认值为 null。这是我想出的代码(不起作用):
public static TValue GetValue<TKey, TValue> (this IDictionary<TKey,
TValue> dictionary, TKey key, TValue defaultValue = null)
{
TValue value;
return dictionary.TryGetValue(key, out value)
? value
: defaultValue;
}
如何只为 nullables
制作这个? (例如,不包括 int
,等等)。
public static TValue GetValue<TKey, TValue> (this IDictionary<TKey,
TValue> dictionary, TKey key, TValue defaultValue = null) where TValue : class
{
TValue value;
return dictionary.TryGetValue(key, out value)
? value
: defaultValue;
}
您的意思是仅针对 reference types
。添加where T: class
如下:
public static TValue GetValue<TKey, TValue> (this IDictionary<TKey,
TValue> dictionary, TKey key, TValue defaultValue = null)
where TValue: class
{
不过,您也可以通过使用 default(TValue)
指定默认值来使它适用于值类型:
public static TValue GetValue<TKey, TValue>(this IDictionary<TKey,
TValue> dictionary, TKey key, TValue defaultValue = default(TValue))
{
TValue value;
return dictionary.TryGetValue(key, out value)
? value
: defaultValue;
}
当然,只有在您确实希望它适用于所有可能的类型时才这样做,而不仅仅是引用类型。
您可以对类型参数使用约束 (MSDN Type Constraints)。你想要的是 class
约束,像这样:
public static TValue GetValue<TKey, TValue> (this IDictionary<TKey,
TValue> dictionary, TKey key, TValue defaultValue = null) where TValue : class
这适用于引用类型,这正是您真正想要的。可为空意味着 int?
之类的东西也能正常工作。
我正在尝试为 IDictionary
- GetValue
制作一个超酷的扩展,如果未设置默认值为 null。这是我想出的代码(不起作用):
public static TValue GetValue<TKey, TValue> (this IDictionary<TKey,
TValue> dictionary, TKey key, TValue defaultValue = null)
{
TValue value;
return dictionary.TryGetValue(key, out value)
? value
: defaultValue;
}
如何只为 nullables
制作这个? (例如,不包括 int
,等等)。
public static TValue GetValue<TKey, TValue> (this IDictionary<TKey,
TValue> dictionary, TKey key, TValue defaultValue = null) where TValue : class
{
TValue value;
return dictionary.TryGetValue(key, out value)
? value
: defaultValue;
}
您的意思是仅针对 reference types
。添加where T: class
如下:
public static TValue GetValue<TKey, TValue> (this IDictionary<TKey,
TValue> dictionary, TKey key, TValue defaultValue = null)
where TValue: class
{
不过,您也可以通过使用 default(TValue)
指定默认值来使它适用于值类型:
public static TValue GetValue<TKey, TValue>(this IDictionary<TKey,
TValue> dictionary, TKey key, TValue defaultValue = default(TValue))
{
TValue value;
return dictionary.TryGetValue(key, out value)
? value
: defaultValue;
}
当然,只有在您确实希望它适用于所有可能的类型时才这样做,而不仅仅是引用类型。
您可以对类型参数使用约束 (MSDN Type Constraints)。你想要的是 class
约束,像这样:
public static TValue GetValue<TKey, TValue> (this IDictionary<TKey,
TValue> dictionary, TKey key, TValue defaultValue = null) where TValue : class
这适用于引用类型,这正是您真正想要的。可为空意味着 int?
之类的东西也能正常工作。