不能将属性或索引器“string.this[int]”分配给——它是只读的

Posted

技术标签:

【中文标题】不能将属性或索引器“string.this[int]”分配给——它是只读的【英文标题】:Property or indexer 'string.this[int]' cannot be assigned to -- it's read only 【发布时间】:2014-02-28 11:31:21 【问题描述】:

我没有发现问题 - 我正在尝试做一个简单的操作:

for(i = x.Length-1, j = 0 ; i >= 0 ; i--, j++)

    backx[j] = x[i];

两者都被声明:

String x;
String backx;

有什么问题?它说标题中的错误... 如果有问题 - 还有其他方法吗? 结果(正如名称 'backx' 所暗示的)是 backx 将包含字符串 X 向后。 附: x 不为空 - 它包含来自另一个字符串的子字符串。

【问题讨论】:

Edit characters in a String in C#的可能重复 【参考方案1】:

字符串是不可变的:您可以在某个位置检索字符,但不能更改直接将字符更改为新字符。

相反,您必须使用更改构建一个新字符串。有几种方法可以做到这一点,但StringBuilder 的工作方式与您已有的类似:

StringBuilder sb = new StringBuilder(backx);
sb[j] = x[i];
backx = sb.ToString();

编辑:如果您查看string 面向公众的 API,您会看到这个索引器:

public char this[int index]  get; 

这表明您可以“获取”一个值,但由于没有可用的“设置”,因此您无法将值分配给该索引器。

EDITx2:如果您正在寻找一种反转字符串的方法,有几种不同的方法,但这里有一个示例说明它是如何工作的:http://www.dotnetperls.com/reverse-string

【讨论】:

【参考方案2】:

String 在 .NET 中是不可变的 - 这就是您收到错误的原因。

你可以用 LINQ 得到一个反向字符串:

string x = "abcd";
string backx = new string(x.Reverse().ToArray()); 

Console.WriteLine(backx);    // output: "dcba"

【讨论】:

【参考方案3】:

字符串是不可变的。您已转换为 Char Array,然后您就可以进行修改。 或者你可以使用 StringBuilder。

例如

char[] wordArray = word.ToCharArray();

【讨论】:

【参考方案4】:

在 C# 中,strings 是不可变的。您不能将第 X 个字符“设置”为任何您想要的字符。如果您想构造一个新字符串,或者能够“编辑”一个字符串,请使用 StringBuilder 类。

【讨论】:

【参考方案5】:

字符串在 C# 中是不可变的。你可以在这里阅读更多信息:http://msdn.microsoft.com/en-us/library/362314fe.aspx

【讨论】:

【参考方案6】:

当您将它们视为数组时,您拥有的两个变量都是字符串(嗯,它们是)。当然,通过这种机制访问字符串中的字符是一个有效的语句,你不能真正这样分配它。

由于您正在尝试反转字符串,请查看this 帖子。它有很多信息。

【讨论】:

【参考方案7】:
    public static string ReverseName( string theName)
    
        string revName = string.Empty;
        foreach (char a in theName)
        
            revName = a + revName;
        

        return revName;
    

这个很简单,不直接涉及数组。

【讨论】:

【参考方案8】:

下面的代码只是简单地交换字符串中每个字符的索引,这使您只需遍历原始字符串的一半,如果您要处理大量字符,这将非常有效。结果是将原始字符串反转。我用一个由 100 个字符组成的字符串对此进行了测试,它在 0.0000021 秒内执行。

private string ReverseString(string testString)
    

        int j = testString.Length - 1;
        char[] charArray = new char[testString.Length];

        for (int i = 0; i <= j; i++)
        

            if (i != j)
            
                charArray[i] = testString[j];
                charArray[j] = testString[i];
            

            j--;
        

        return new string(charArray);
    

【讨论】:

【参考方案9】:

如果您需要更换,例如字符串中的索引 2 使用它(它很丑,但可以工作并且易于维护)

V1 - 你知道你想放什么。你在这里用伪代码说 string[2] = 'R';

row3String.Replace(row3String[2], 'R');

V2 - 你需要把他们的 char R 或 char Y 放在这里 string[2] = 'R' if is 'Y' or if was not stay 'Y' (一行 if 需要某种形式的 else)

row3String.Replace(row3String[2], row3String[2].Equals('Y') ? 'R' : 'Y');

【讨论】:

以上是关于不能将属性或索引器“string.this[int]”分配给——它是只读的的主要内容,如果未能解决你的问题,请参考以下文章

属性、索引器或动态成员访问不能作为 out 或 ref 参数传递[重复]

C# NET 3.5:属性或索引器不能分配给“--”,它是只读的

属性或索引器不能分配给“”它是只读的[重复]

C#索引器

没有 VAO 的每个着色器属性的 VBO 或不同的方法?

C#索引器