如何以正确的方式初始化KeyValuePair对象?

46 c# initialization

我已经在(其中包括)这个问题中看到人们想知道如何初始化KeyValuePair的实例,预计应该看起来像这样.

KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>
{ 
  Key = 1,
  Value = 2
};
Run Code Online (Sandbox Code Playgroud)

它不起作用,好像属性不存在.Intead,我需要像这样使用构造函数.

KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);
Run Code Online (Sandbox Code Playgroud)

不可否认,语法较短,但我不能使用初始化程序.我究竟做错了什么?

Kev*_*tch 53

你没有错,你必须初始化keyValuePair使用

KeyValuePair<int, int> keyValuePair = new KeyValuePair<int, int>(1, 2);
Run Code Online (Sandbox Code Playgroud)

你不能使用对象初始化语法即{Key = 1,Value = 2}的原因是Key和Value属性没有setter only getter(它们只读).所以你甚至不能这样做:

keyValuePair.Value = 1; // not allowed
Run Code Online (Sandbox Code Playgroud)


Den*_*nis 14

KeyValuePair<int, int>是一个结构,幸运的是,它是不可变的结构.特别是,这意味着它的属性是只读的.因此,您无法使用对象初始化程序.

  • @jbl结构可以具有读写属性 (3认同)

naw*_*fal 10

好的,你有答案.作为替代方案,我更喜欢类似于Tuple类的工厂模式,用于类型推理魔术:)

public static class KeyValuePair
{
    public static KeyValuePair<K, V> Create<K, V>(K key, V value)
    {
        return new KeyValuePair<K, V>(key, value);
    }
}
Run Code Online (Sandbox Code Playgroud)

如此短暂变短:

var keyValuePair = KeyValuePair.Create(1, 2);
Run Code Online (Sandbox Code Playgroud)


flo*_*dis 9

字典具有紧凑的初始化器:

var imgFormats = new Dictionary<string, ChartImageFormat>()
{
    {".bmp", ChartImageFormat.Bmp}, 
    {".gif", ChartImageFormat.Gif}, 
    {".jpg", ChartImageFormat.Jpeg}, 
    {".jpeg", ChartImageFormat.Jpeg}, 
    {".png", ChartImageFormat.Png}, 
    {".tiff", ChartImageFormat.Tiff}, 
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我用来将文件扩展名与图表对象的图像格式常量相关联.

可以从字典中返回单个keyvaluepair,如下所示:

var pair = imgFormats.First(p => p.Key == ".jpg");
Run Code Online (Sandbox Code Playgroud)


小智 7

这是一个可以完成工作的示例

KeyValuePair<int, int> kvp = new KeyValuePair<int, int>(1, 1);
Run Code Online (Sandbox Code Playgroud)


Mih*_*kov 5

键和值属性没有设置器。这就是为什么您不能在初始化程序中使用它们的原因。只需使用构造函数:)就可以了。


Phi*_*hil 1

Key和Value属性是只读的,因此不能在对象初始值设定项中使用它们

请参阅C# 编程指南中的此条目。