当前位置:  开发笔记 > 编程语言 > 正文

编写通用扩展方法时类型推断有问题

如何解决《编写通用扩展方法时类型推断有问题》经验,为你挑选了1个好方法。

我真的很讨厌IDictionary [key]如果字典中不存在密钥会如何抛出异常.

当然有TryGetValue(),但似乎已经针对性能而非可用性进行了优化.

所以我想,哦,我只是为它做一个扩展方法 - 我做了:

public static class CollectionExtensions
{
    public static TType GetValueOrDefault(this IDictionary dictionary, TKeyType key)
    {
        TType value = default(TType);

        // attempt to get the value of the key from the dictionary
        // if the key doesn't exist just return null
        if (dictionary.TryGetValue(key, out value))
        {
            return value;
        }
        else
        {
            return default(TType);
        }
    }    
}

这工作正常除了我似乎无法得到类型推断工作.

显然我希望能够做到以下几点:

var extraDataLookup = new Dictionary();
extraDataLookup["zipcode"] = model.Zipcode; 

然后能够访问该值:

var zipcode = extraDataLookup.GetValueOrDefault("zipcode");
var foo = extraDataLookup.GetValueOrDefault("foo"); // should be null

我已经看了一些关于类型推断的事情,将Jon Skeet的文章甚至源代码都反映System.Linq.Enumerable在反射器中,但似乎缺少某些东西.

这有效:

extraDataLookup.GetValueOrDefault ("foo") 

但事实并非如此

extraDataLookup.GetValueOrDefault ("foo") 

我该怎么办

PS.我只是在寻找泛型类型推理问题的解决方案,而不是任何其他建议.谢谢.



1> Matt Hamilto..:

当您只需要两个泛型类型时,您似乎正在使用三种泛型类型定义扩展方法."TValue"和"TType"意思相同,不是吗?试试这个:

public static TValue GetValueOrDefault(
    this IDictionary dictionary, TKey key)
{
    TValue value;
    // attempt to get the value of the key from the dictionary
    dictionary.TryGetValue(key, out value);
    return value;
}    

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有