none
C# → VB.NET に移植したいソースで不明な構文があります RRS feed

  • 質問

  • お世話になります。
    以下のような C# の構文を VB.NET に移植したいのですが、

    IEnumerable以下のブロックはどういった構文で、
    VB.NET ではどのように記述すればよいのでしょうか。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
        public static IEnumerable<string> Test()
        {
            IEnumerable<string> ret() // ←ここが分かりません
            {
                for (int i = 0; i < 10; i++)
                {
                    yield return i.ToString();
                }
            }
            return ret();
        }
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

    キーワードが分からず、調べることができません。

    どなたかご教授お願い致します。
    2019年10月23日 13:04

回答

  • C# 7.0で追加されたローカル関数です。簡単に言えば、関数内に関数を記述することができるようになりました。VB.NETには同様の機能は提供されていなさそうなので、関数の外に記述する必要があります。ただし厳密には同一ではないので注意が必要です。
    2019年10月23日 14:09
  • ''' <summary>1つの関数に入れるなら</summary>
    Public Shared Function Test() As IEnumerable(Of String)
        Dim ret As IEnumerable(Of String) _
            = Iterator Function()
                  For i As Integer = 0 To 9
                      Yield i.ToString()
                  Next
              End Function()
        Return ret
    End Function
    
    
    
    ''' <summary>2関数に分割していいなら</summary>
    Public Shared Function Test2() As IEnumerable(Of String)
        Dim ret As IEnumerable(Of String) = Test2_InternalFunction()
        Return ret
    End Function
    Friend Shared Iterator Function Test2_InternalFunction() As IEnumerable(Of String)
        For i As Integer = 0 To 9
            Yield i.ToString()
        Next
    End Function

    C#のコードは以下のようにすれば意味が判り易いと思う

    public static IEnumerable<string> Test()
    {
        return ret();
    }
    private static IEnumerable<string> ret()
    {
        for (int i = 0; i < 10; i++)
        {
            yield return i.ToString();
        }
    }

    追記:

    Public Shared Function Test() As IEnumerable(Of String)
        Dim ret As Func(Of IEnumerable(Of String)) _
            = Iterator Function()
                  For i As Integer = 0 To 9
                      Yield i.ToString()
                  Next
              End Function
        Return ret()
    End Function
    

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)


    • 回答としてマーク viator5 2019年10月23日 15:08
    • 編集済み gekkaMVP 2019年10月23日 15:58 元のコードにより近いコードを追記
    2019年10月23日 14:11

すべての返信

  • C# 7.0で追加されたローカル関数です。簡単に言えば、関数内に関数を記述することができるようになりました。VB.NETには同様の機能は提供されていなさそうなので、関数の外に記述する必要があります。ただし厳密には同一ではないので注意が必要です。
    2019年10月23日 14:09
  • ''' <summary>1つの関数に入れるなら</summary>
    Public Shared Function Test() As IEnumerable(Of String)
        Dim ret As IEnumerable(Of String) _
            = Iterator Function()
                  For i As Integer = 0 To 9
                      Yield i.ToString()
                  Next
              End Function()
        Return ret
    End Function
    
    
    
    ''' <summary>2関数に分割していいなら</summary>
    Public Shared Function Test2() As IEnumerable(Of String)
        Dim ret As IEnumerable(Of String) = Test2_InternalFunction()
        Return ret
    End Function
    Friend Shared Iterator Function Test2_InternalFunction() As IEnumerable(Of String)
        For i As Integer = 0 To 9
            Yield i.ToString()
        Next
    End Function

    C#のコードは以下のようにすれば意味が判り易いと思う

    public static IEnumerable<string> Test()
    {
        return ret();
    }
    private static IEnumerable<string> ret()
    {
        for (int i = 0; i < 10; i++)
        {
            yield return i.ToString();
        }
    }

    追記:

    Public Shared Function Test() As IEnumerable(Of String)
        Dim ret As Func(Of IEnumerable(Of String)) _
            = Iterator Function()
                  For i As Integer = 0 To 9
                      Yield i.ToString()
                  Next
              End Function
        Return ret()
    End Function
    

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)


    • 回答としてマーク viator5 2019年10月23日 15:08
    • 編集済み gekkaMVP 2019年10月23日 15:58 元のコードにより近いコードを追記
    2019年10月23日 14:11
  • 佐祐理様

    早速のご返信ありがとうございます。

    匿名関数と違うようなと思ったら、ローカル変数という
    ものがあるのですね。

    1つのメソッドに入れるパターン、2つのメソッドに分割と
    ご丁寧にありがとうございます。

    また、C#の匿名関数も、分割しての丁寧な解説ありがとうございます。

    ご返信のおかげで実装できました。
    2019年10月23日 15:17