通用接口和方法问题

时间:2018-03-27 11:09:35

标签: c# generics interface

我目前正在尝试实现通用接口。

public interface IAssociatedTrie<T> 
{
    bool Contains(string key);
    T GetValue(string key);
    void Add(string key, T value);
}

我有一个实现此接口的类

 class Trie<T> : IAssociatedTrie<T>
 {
    //some work

    public void Add(string key, T value)
    {
        //some work
    }
    ...
 }

然后我想将带有IAssociatedTrie接口的类实例传递给某个方法

static void Main(string[] args)
    {
        Trie<int> myTrie = new Trie<int>();
        TestTrie(myTrie);
    }

private static void TestTrie<T>(IAssociatedTrie<T> myTrie) 
    {
        //some work
        myTrie.Add("oa", 3); //error
        //some work
    }

但是在这里我得到CS1503错误“无法将int转换为T”。我找到了

myTrie.Add("oa", (T)(object)4);

修复问题,但这看起来非常不优雅,我很确定我做错了什么。如何在不解析为object-&gt; T?

的情况下修改方法/类方法

2 个答案:

答案 0 :(得分:2)

您的方法是通用。这意味着您的代码必须适用于任何 T

添加3的代码仅适用于T = int 。如果我使用T = Elephant调用您的方法,该怎么办?您无法将3投射到Elephant

我不知道你想要做什么。使用常量3是错误的,或者使用通用T是错误的。这是你唯一可以决定的事情。但是您的编译器在标记此错误时是正确的。您不能将常量3用作T的值。

答案 1 :(得分:1)

当你说myTrie.Add("oa", 3);时 - 我不确定首先使用泛型方法有什么意义。但是,看起来你打算使用类似的东西:

private static void TestTrie<T>(IAssociatedTrie<T> myTrie, T value) 
    {
        myTrie.Add("oa", value);
    }