C# 字典和获取值的类型

C# 字典和获取值的类型,c#,dictionary,C#,Dictionary,我有一个类,它包含如下内容Dictionary dict,然后我使用TryGetValue: Queue<string> value; if (!dict.TryGetValue(3, out value)) throw new MyException("..."); 队列值; 如果(!dict.TryGetValue(3,输出值)) 抛出新的MyException(“…”); 是否有一个不显式定义值类型的选项,基本上是为了避免键入值的重复性?在C++ STL容器中,有一

我有一个类,它包含如下内容
Dictionary dict
,然后我使用
TryGetValue

Queue<string> value;
if (!dict.TryGetValue(3, out value))
    throw new MyException("...");
队列值;
如果(!dict.TryGetValue(3,输出值))
抛出新的MyException(“…”);

是否有一个不显式定义值类型的选项,基本上是为了避免键入值的重复性?在C++ STL容器中,有一个TyPufF<代码> ValueSyType 的值,它可以用于这种情况,但在C语言中我似乎找不到类似的特性。谢谢

您可以将片段重新编写为

if (!dict.ContainsKey(3))
    throw new MyException("...");
var value = dict[3];
或者,不知羞耻地从AakashM的答案中窃取和改编,您可以编写自己的扩展方法来交换
TryGetValue
参数:

public static V ValueGetTry<K, V>(this Dictionary<K, V> d, K k, out bool found)
{
    V v;
    found = d.TryGetValue(k, out v);
    return v;
}

这应该适用于任何类型参数,并且只查询字典一次。

否。如果使用了
ContainsKey
并将其索引到字典中,则可以使用隐式类型变量,如中所示:

var key = 3;
if (!dict.ContainsKey(key)) {
    throw new ...;
}

var value = dict[key];

当然,这会稍微降低效率。但是没有选项将
var
TryGetValue

一起使用,如果您定义了一个很好的助手方法,您可以总结类型规范:

public static class Utility
{
    public static TValue GetValueOrDefault<TKey,TValue>(
        this Dictionary<TKey, TValue> dictionary, 
        TKey key, 
        TValue @default = default(TValue))
    {
        TValue value;
        return dictionary.TryGetValue(key, out value)
                   ? value
                   : @default;
    }
}

请注意,如果
null
在此上下文中是一个有效值,那么您将需要其他内容,但同样的原则也可以应用-使用编译器可以推断泛型方法的类型来构建一个帮助器方法来隐藏显式类型。

现在,使用内联
out
变量的C#7.0就可以做到这一点

if (!dict.TryGetValue(3, out var value))
    throw new MyException("...");

请参见

它应该是
输出值
,顺便说一句。不,没有这样的功能,C#无法进行类型别名。默认检查仍然需要根据参数的类型进行更改-例如,int为零等。您可以使用
输出值
参数,而不是默认值(即从
TryGetValue
切换返回值和输出值)。
var value = dict.GetValueOrDefault(3);    // implicitly typed
if (value == null)
    throw new MyException("...");
if (!dict.TryGetValue(3, out var value))
    throw new MyException("...");