如何在检索

时间:2015-07-26 11:03:42

标签: c# dictionary

这是我编写的代码,它是一个扩展,用于通过指定的强制转换

从字典中获取值
public static TResult GetValue<TKey, TValue, TResult>(this Dictionary<TKey, TValue> dictionary, TKey key)
{
    if (!dictionary.ContainsKey(key))
    {
        return default(TResult);
    }

    return dictionary[key] as TResult;
}

错误表明,

  

错误1类型参数'TResult'不能与'as'运算符一起使用,因为它没有类类型约束,也没有'class'约束

无法找到实现此目的的方法。

我只需要从方法中指定我需要它作为返回类型的类型。所以我需要使用这种泛型类型来转换字典值。

请帮助我!

提前致谢。

3 个答案:

答案 0 :(得分:3)

您需要告诉编译器和API的用户TResult将是引用类型的名称,而不是值类型的名称:

public static TResult GetValue<TKey, TValue, TResult>(this Dictionary<TKey, TValue> dictionary, TKey key)
    where TResult : class {
    ...
}

这是让您使用as TResult运算符所必需的。如果您希望为值类型提供类似的功能,请添加一个单独的函数,该函数采用值TResult的值类型,然后返回Nullable<TResult>

public static TResult? GetNullableValue<TKey, TValue, TResult>(this Dictionary<TKey, TValue> dictionary, TKey key)
    where TResult : struct {
    ...
}

答案 1 :(得分:2)

as关键字仅对引用类型\ nnullables有效。
如果您想要限制,请使用强制转换运算符或添加where TResult : class约束。

 public static TResult GetValue<TKey, TValue, TResult>(this Dictionary<TKey, TValue> dictionary, TKey key)
    {
        if (!dictionary.ContainsKey(key))
        {
            return default(TResult);
        }

        return (TResult)dictionary[key];
    }

答案 2 :(得分:1)

编译器对body { background: #6cab26; background-image: url(IMAGE_URL); /* fallback */ background-image: url(IMAGE_URL), -webkit-gradient(linear, left top, left bottom, from(#6cab26), to(#6ceb86)); /* Saf4+, Chrome */ background-image: url(IMAGE_URL), -webkit-linear-gradient(top, #6cab26, #6ceb86); /* Chrome 10+, Saf5.1+ */ background-image: url(IMAGE_URL), -moz-linear-gradient(top, #6cab26, #6ceb86); /* FF3.6+ */ background-image: url(IMAGE_URL), -o-linear-gradient(top, #6cab26, #6ceb86); /* Opera 11.10+ */ background-image: url(IMAGE_URL), linear-gradient(to bottom, #6cab26, #6ceb86); /* W3C */ } 一无所知。尝试添加TResult

where TResult: class

但是** ** chglurps *评论说,最好使用public static TResult GetValue<TKey, TValue, TResult>( this Dictionary<TKey, TValue> dictionary, TKey key ) where TResult: class