2016-04-29 74 views
5

大家好我是新来的C#语言,我是用vb.net, 下面这有什么代码,为什么错误,谢谢的IEnumerator IEnumerable的VB到C#

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”不能已经分配到 - 它是只读

+1

尝试用'var functionReturnValue = this.Sentence.Substring'替换'Current = this.Sentence.Substring ...'# –

+0

@YacoubMassad感谢ycoub先生,但为什么我不得不写“function Return Value”我想要准确理解为什么发生此错误 –

+1

有趣。我想这与VB6的向后兼容性有关。在那里你可以给方法名分配一个值,而不是返回它。所以这只适用于只读属性getter,无处可用。 –

回答

5

Current = Me.Sentence.Substring(Me.currentPosition, tmpLength) ' ok 

是设定的方法的返回值不使用Return关键字的“老” VB的方式。一般来说,下面的VB代码

myMethodName = ... 
    ...some other code... 
End Function 

可以(只要some other code不退出方法)改写为

Dim someTempVariable = ... 
    ...some other code... 
    Return someTempVariable 
End Function 

属性也是如此。因此,我们首先重写 VB代码 VB代码:

 ... 
    Next 
    Dim returnValue = Me.Sentence.Substring(Me.currentPosition, tmpLength) 
    Me.currentPosition += tmpLength + 1 
    Return returnValue 
End Get 

,现在翻译到C#应该是显而易见的。

+0

什么是正确的代码与C# –

0

当前和functionReturnValue瓦里能够在你的代码中定义函数中没有定义。

Current = this.Sentence.Substring(this.currentPosition, tmpLength); // Error 
    return functionReturnValue; 
0

您还没有宣布参加Current财产set块,所以它是只读的。您需要实现它,像:

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; 
    } 
    set 
    { 
     this.Current = value; 
    } 
} 
+0

是的,我没有为Current声明一个设置块,因为当你实现接口IEnumerator时,Visual Studio会生成没有设置的当前属性块 公共对象当前 {throw new NotImplementedException(); } } –

3

(对于VB6向后兼容性/传统的原因)VB.NET允许从一个或PropertyFunctionFunction/Property名称设置为值返回值。

从文档:Function Procedures

"... The procedure returns this value in one of two ways:..."

  • "...It assigns a value to its own function name in one or more statements of the procedure. Control does not return to the calling program until an Exit Function or End Function statement is executed..."

例如

Public Function TestFunc() As String 
    TestFunc = "bar" 
    'some code 
End Function 

这大致相当于:

Public Function TestFunc() As String 
    Dim temp = "bar" 
    'some code 
    Return temp 
End Function 
在VB代码

因此,它是设置属性名称,以返回值:

Public ReadOnly Property Test As String 
    Get 
     Test = "foo" 
    End Get 
End Property 

或在您的情况:

Current = Me.Sentence.Substring(Me.currentPosition, tmpLength) 

Ther e是直接相当于C#中的这个,因为return会立即返回。最好的所以相当于C#是设置一个临时变量,并返回:

var temp= this.Sentence.Substring(this.currentPosition, tmpLength); 
//some more code 
return temp; 

每当我从VB类中的访问属性,我一直前缀我的属性与Me.避免了这个讨厌的行为