C#-代码有什么问题(泛型、静态方法等)

C#-代码有什么问题(泛型、静态方法等),c#,.net,generics,C#,.net,Generics,在下面的代码中,我得到一个“无法从'int'转换为'TValue'”。我怎样才能解决这个问题?我理解为什么会有问题,但我想知道最好的解决办法。我是否需要决定特定类型的ReturnValuesDict,而不是将其保留为通用类型 public class ReturnValuesDict<TKey, TValue> : CloneableDictionary<TKey, TValue> { public static ReturnValuesDict<TKey

在下面的代码中,我得到一个“无法从'int'转换为'TValue'”。我怎样才能解决这个问题?我理解为什么会有问题,但我想知道最好的解决办法。我是否需要决定特定类型的ReturnValuesDict,而不是将其保留为通用类型

public class ReturnValuesDict<TKey, TValue> : CloneableDictionary<TKey, TValue>
{

    public static ReturnValuesDict<TKey, TValue> CreateEmptyClone(ReturnValuesDict<TKey, TValue> current) 
    {
        var newItem = new ReturnValuesDict<TKey, TValue>();
        foreach (var curr in current)
        {
            newItem.Add(curr.Key, 0);  // ERROR on the 2nd parameter here
        }
        return newItem;
    }

}
public类返回值dict:CloneableDictionary
{
公共静态返回值ICT CreateEmptyCyclone(返回值ICT当前)
{
var newItem=新返回值dict();
foreach(当前的var curr)
{
newItem.Add(curr.Key,0);//此处第二个参数出错
}
返回新项目;
}
}

这不编译的原因是0(一个
int
)通常不能转换为字典值的类型(
TValue
),就编译器而言,这是一种任意类型。(
其中TValue:int
不起作用,但那是另一回事)

我假设您正试图构建一个字典,它的键与原始的键相同,但值为空

如果.NET认为某个类型的“默认”值合适,可以尝试将该行更改为:

newItem.Add(curr.Key, default(TValue));  
这将使用字典值的类型。例如:
null
表示引用类型,零表示数值类型

另一方面,如果打算编写一个只适用于具有
int
值的词典的方法,则可以将其限制性更强(将其放在另一个类中):

公共静态返回值ICT CreateEmptyCyclone(返回值ICT当前)
{
var newItem=新返回值dict();
foreach(当前的var curr)
{
newItem.Add(curr.Key,0);
}
返回新项目;
}

请注意,该方法现在是一个通用方法,它采用一个无约束的泛型
TKey
参数。

该方法不编译的原因是0(一个
int
)通常不能转换为字典值类型(
TValue
),就编译器而言,它是一种任意类型。(
其中TValue:int
不起作用,但那是另一回事)

我假设您正试图构建一个字典,它的键与原始的键相同,但值为空

如果.NET认为某个类型的“默认”值合适,可以尝试将该行更改为:

newItem.Add(curr.Key, default(TValue));  
这将使用字典值的类型。例如:
null
表示引用类型,零表示数值类型

另一方面,如果打算编写一个只适用于具有
int
值的词典的方法,则可以将其限制性更强(将其放在另一个类中):

公共静态返回值ICT CreateEmptyCyclone(返回值ICT当前)
{
var newItem=新返回值dict();
foreach(当前的var curr)
{
newItem.Add(curr.Key,0);
}
返回新项目;
}

请注意,该方法现在是一个泛型方法,它接受一个无约束的泛型
TKey
参数。

0来自哪里?你想完成什么?编辑:我想我想说的是,“到底什么是空应该是什么意思?”你的问题是你的方法返回一个泛型集合(tkey,tvalue),但是你试图添加一个带有0(int)的tvalue,这就违背了使用泛型的初衷。:)@Ani的答案是前进的方向。0来自哪里?你想完成什么?编辑:我想我想说的是,“到底什么是空应该是什么意思?”你的问题是你的方法返回一个泛型集合(tkey,tvalue),但是你试图添加一个带有0(int)的tvalue,这就违背了使用泛型的初衷。:)@Ani的答案是正确的。或者,如果他愿意,他可以使用
null
而不是0(我认为这是他的意图),前提是
TValue
是引用类型。他可以使用
where
子句来说明这一点。如果他愿意,他可以使用
null
而不是0(我认为这是他的意图),只要
TValue
是引用类型。他可以使用
where
子句来说明这一点。