【发布时间】:2016-08-24 09:58:54
【问题描述】:
大家好,我是 c# 语言的新手,我使用的是 vb.net, 在下面这段代码有什么错误以及为什么,谢谢
vb.net code
Class SplitString
Implements IEnumerable
Implements IEnumerator
Private currentPosition As Integer = 0
Private m_Sentence As String
Property Sentence() As String
Get
Return m_Sentence
End Get
Set(ByVal Value As String)
m_Sentence = Value
Me.Reset()
End Set
End Property
Public ReadOnly Property Current As Object Implements IEnumerator.Current
Get
Dim counter As Integer
Dim tmpLength As Integer = 0
For counter = Me.currentPosition To Me.Sentence.Length - 1
If Me.Sentence.Chars(counter) = " "c Then
Exit For
Else
tmpLength += 1
End If
Next
Current = Me.Sentence.Substring(Me.currentPosition, tmpLength) ' ok
Me.currentPosition += tmpLength + 1
End Get
End Property
Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
If Me.currentPosition > Me.Sentence.Length - 1 Then
Me.Reset()
Return False
Else
Return True
End If
End Function
Public Sub Reset() Implements IEnumerator.Reset
Me.currentPosition = 0
End Sub
Public Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
Return Me
End Function
End Class
但是当我尝试这个代码到 c# 时,我得到了错误
c# code
class SplitString:IEnumerable,IEnumerator
{
private int currentPosition = 0;
private string m_Sentence;
public string Sentence
{
get { return m_Sentence; }
set
{
m_Sentence = value;
this.Reset();
}
}
public IEnumerator GetEnumerator()
{
return this;
}
public object Current
{
get
{
int counter = 0;
int tmpLength = 0;
for (counter = this.currentPosition; counter <= this.Sentence.Length - 1; counter++)
{
if (this.Sentence[counter] == ' ')
{
break;
}
else
{
tmpLength += 1;
}
}
Current = this.Sentence.Substring(this.currentPosition, tmpLength); // Error
this.currentPosition += tmpLength + 1;
return functionReturnValue;
}
}
public bool MoveNext()
{
if (this.currentPosition > this.Sentence.Length-1)
{
this.Reset();
return false;
}
else
{
return true;
}
}
public void Reset()
{
this.currentPosition=0;
}
}
错误:无法将属性或索引器“Example.splitstring.current”分配给——它是只读的
【问题讨论】:
-
尝试用
var functionReturnValue = this.Sentence.Substring...替换Current = this.Sentence.Substring... -
@YacoubMassad 感谢 yacoub 先生,但为什么我不得不写“函数返回值”我想确切了解为什么会发生此错误
-
有趣。我想这与 VB6 向后兼容性有关。在那里,您可以为方法名称分配一个值,而不是返回它。所以这只适用于 readonly-property-getter,没有其他地方。
-
要在函数中设置返回值,必须使用
return someValue;(也结束函数),不能将值赋给函数(老式VB习语) -
@HansKesting:实际上你可以做到这一点。它编译并工作。但当然只在属性的 getter 中,而不是来自外部,你应该使用
Return ...代替。
标签: c# .net vb.net vb.net-to-c#