0

我的结构类:

public struct PinAndRadius
{
    public string pinID { get; set; }
    public string radiusID { get; set; }

    public string getPinID()
    {
        return pinID;
    }

    public string getRadiusID()
    {
        return radiusID;
    }
}

有问题的方法:

void mapArea_VE_PinDragged(double latitude, double longitude, object id)
{
    foreach (var pin in pinRadiusCollection)
    {
        string ID = id.ToString();
        //string newID = ID.Substring(0, 18);
        if (!pin.Key.pinID.Equals(ID))
        {
            continue;
        }
        else if (pin.Key.pinID.Equals(ID))
        {
            var newLoc = createNewSearchLocation(latitude, longitude);
            mapArea.VE_DeleteRadius(pin.Key.radiusID);
            drawPoly(newLoc, pin.Value.xar_Radius);
            pin.Key.radiusID = pollyID;
            break;
        }
    }
}

问题是当我尝试设置pin.key.radiusID为 pollyID 时,我收到一条错误消息

无法修改“System.Collections.Generic.KeyValuePair.Key”的返回值,因为它不是变量...

有任何想法吗?

4

4 回答 4

0

.net 中的结构是值类型。这意味着您无法参考PinAndRadiususing pin.Key。您将获得 pin.Keytype 的副本PinAndRadius。然后您无法访问此副本,编译器会告诉您这一点。在 C++ 术语中,它不是左值。

如果您创建struct总是尝试使其不可变。可变结构是邪恶的。

解决这个问题的最简单方法是制作PinAndRadiusas class

于 2012-12-21T14:54:19.130 回答
0

从外观上看,您是一个以;pinRadiusCollection为键的通用字典。PinAndRadius您得到的错误是让您知道您无法修改该对象,因为它被用作字典中的键。

如果您的引脚应该是可变的,您可能应该重新审视您存储它们的方式。

于 2012-12-21T14:58:22.913 回答
0

.net 中的集合未设置为允许方便地修改其中包含的结构类型项目。尽管如此,可变结构仍然提供比任何其他类型的数据类型更清晰的语义。要编辑集合中的结构,只需将其复制到一个变量,编辑该变量,然后将其存储回来:

var temp = myList[someIndex];
temp.SomeVield = whatEver;
myList[someIndex] = temp;

请注意,通常让可变结构将其内容公开为字段比作为属性更好。有些人可能会说可变结构是邪恶的,因为它们的语义与类不同,但这就像说螺丝刀是邪恶的,因为它们制造了糟糕的锤子。暴露字段结构不像类类型那样工作,但所有字段都暴露的结构都具有彼此相同的语义。这些语义与类不同,但在它们有用的情况下,它们是不平等的。

顺便说一句,“可变结构”得到的大部分不良代表是因为如果应用于只读结构,除了暴露字段之外的变异结构成员通常会生成虚假代码。如果您避免使用修改字段的结构成员this[静态结构方法修改作为ref参数接收的结构的字段是完全安全的],则这些危险不适用。

于 2012-12-22T21:04:45.213 回答
0

我只是将结构定义更改为一个类。

于 2013-01-07T09:13:38.917 回答