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