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,等等)。

使用class constraint:

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? 之类的东西也能正常工作。