C# vs VB.NET(コードの比較表)

マニュアルコンバート派のための、C# コードと VB.NET コードの比較表です。

当サイトの管理人が C# コードを VB.NET コードに書き換えるために調べたものを整理してまとめました。

変数

変数の型

C#VB.NET
boolBoolean
byteByte
charChar
decimalDecimal
doubleDouble
floatSingle
intInteger
longLong
objectObject
sbyteSByte
shortShort
stringString
uintUInteger
ulongULong
ushortUShort

変数の宣言と初期化

C#VB.NET
var s;Dim s
int num = 1;Dim num As Integer = 1

配列の宣言と初期化

C#int[] numbers = new int[3] { 4, 5, 6 };
int[] numbers = new int[] { 4, 5, 6 };
VB.NETDim numbers As Integer() = New Integer(2) {4,5,6}
Dim numbers As Integer() = New Integer() {4,5,6}
Dim numbers As Integer() = {4,5,6}

C# の new int[3] は、 3 つの要素(入れ物)を作るという意味。結果として int[0], int[1], int[2] が作られる。
VB.NET の New Integer(2) は、最大のインデックスが 2 までの要素を作る。結果として int[0], int[1], int[2] が作られる。

List の宣言と初期化

C#var intList = new List<int>();
VB.NETDim intList = New List(Of Integer)
Dim intList As New List(Of Integer)
C#List<int> list = new List<int> {1,2,3,4,5,6,7,8,9,10,};
VB.NETDim list As List(Of Integer) = _
    New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

Dictionary の宣言と初期化

C#var dic = new Dictionary<intstring> {
    { 1, "aaa"}, { 2, "bbb"}, { 3, "ccc"},
};
VB.NETDim dic = New Dictionary(Of IntegerString) From {
    {1, "aaa"}, {2, "bbb"}, {3, "ccc"}
}

関数

戻り値が無い関数

C#private void abc()
{
    Console.WriteLine("abc");
}
VB.NETPrivate Sub abc()
    Console.WriteLine("abc")
End Sub

戻り値のある関数

C#public string someFunction()
{
    return someString;
}
VB.NETPublic Function someFunction() As String
    Return someString
End Function

関数の引数

C#public string someFunction(string s)
{
    return someString;
}
VB.NETPublic Function someFunction(s As String) As String
    Return someString
End Function

引数の値渡し

C#VB.NET
特別な記述の必要なし

特別な記述の必要なし
   または
ByVal(明示的な値渡し)

引数の参照渡し

C#VB.NET
ref または out

ByRef

ref は ByRef とほぼ同等だが、呼び出し元の関数内で変数の初期化が必要。
out も似ているが、変数の初期化は不要。ただし out は関数内からその外に値を渡す場合に使うので、呼び出される関数内で必ず値をセットする必要がある。
ref も out も、呼び出し元の関数と呼び出される関数の両方でキーワードを明示的に使用する必要がある。

C#public static void Sample(ref int arg)
{
    :
}

public static void Main()
{
    int val = 0; // 値を割り当てないとエラーになる
    Sample(ref val);
}

C#public static void Sample(out int arg)
{
    arg = 1; // 値を割り当てないとエラーになる
}

public static void Main()
{
    int val;
    Sample(out val);
}

VB.NETPublic Shared Sub Sample(ByRef arg As Integer)
    :
End Sub

Public Shared Sub Main()
    Dim val = 0 ' 値を割り当てなくてもエラーにはならない
    Sample(val)
End Sub

値渡しの強制

C#VB.NET
該当なし

Public Shared Sub Sample(ByRef arg As Integer)
    ' 引数には参照渡しの ByRef が付いているが
        :
End Sub

Public Shared Sub Main()
    Dim val As Integer = 0
    '値渡しを強制する
    Sample((val))
        :
End Sub

可変長引数

C#void Sample(params string[] param)
{
    ...
}
VB.NETSub Sample(ParamArray ByVal params As String())
    :
End Sub

関数のアクセス修飾子

C#VB.NET
internalFriend
privatePrivate
publicPublic
protectedProtected

関数のその他の修飾子

C#abstract
VB.NET

MustOverride

派生クラスでオーバーライドする必要がある基本クラスのプロパティやプロシージャ。

MustInherit

インスタンス化できず、基本クラスとしてのみ使用できるクラス。

C#sealed
VB.NET

NotOverridable

派生クラスでオーバーライドできないプロパティまたはプロシージャ。

NotInheritable

基本クラスとして使用できないクラス。

C#VB.NET
指定不要Overloads
名前は既存のメンバと同じだが、引数リストが既存のメンバとは異なるプロパティやメソッドであることを示す。
C#VB.NET
newShadows
宣言したプログラミング要素が、基本クラスで同じ名前を持つ要素、またはオーバーロードされた要素のセットをシャドウすることを示す。宣言された要素は、他の任意の種類の要素でシャドウできる。シャドウされた要素は、その要素をシャドウする派生クラスでは使用できない。
C#protected override void OnClick(EventArgs e) {
     :
}
VB.NETProtected Overrides Sub OnClick(ByVal e As EventArgs)
     :
EndSub
C#VB.NET
staticShared
virtualOverridable
class DerivedClass: BaseClassClass DerivedClass
    Inherits BaseClass
class DerivedClass: BaseInterfaceClass DerivedClass
    Implements BaseInterface

クラス

コンストラクタ

C#public class SomeClass
{
    //コンストラクタ
    //クラス名と同じ名前
    public SomeClass()
    {
        :
    }
}
VB.NETPublic Class SomeClass
    'コンストラクタ
    Public Sub New()
       :
    End Sub
End Class

デストラクタ

ファイナライザ

C#public class SomeClass
{
    //デストラクタ
    //クラス名に ~ を付ける
    ~SomeClass()
    {
        :
    }
}
VB.NETPublic Class SomeClass
    Protected Overrides Sub Finalize()
        :
    End Sub
End Class

IDisposable

C#public class SomeClass : IDisposable
{
    public void Dispose()
    {
        :
    }
}
VB.NETPublic Class SomeClass
    Implements IDisposable

    Sub Dispose() _
        Implements IDisposable.Dispose
       :
    End Sub
End Class

イベントハンドラ

登録

C#Button1.Click += new EventHandler(Button1_Click); //Forms?
Button1.Click += new RoutedEventHandler(Button1_Click); //WPF
Button1.Click += Button1_Click;
VB.NETAddHandler Button1.Click, AddressOf Button1_Click

解除

C#Button1.Click -= new EventHandler(Button1_Click); //Forms?
Button1.Click -= new RoutedEventHandler(Button1_Click); //WPF
Button1.Click -= Button1_Click;
VB.NETRemoveHandler Button1.Click, AddressOf Button1_Click

キャスト

C#(type)variable
VB.NETCType(variable, type)、DirectCast(variable, type)、
CBool / CByte / CChar / CDate / CDbl / CDec / CInt / CLng / CObj / CSByte / CShort / CSng / CStr / CUInt / CULng / CUShort
C#int i = (int)doubleVal
VB.NETDim i As Integer = CType(doubleVal, Integer)
Dim i As Integer = DirectCast(doubleVal, Integer)
Dim i As Integer = CInt(doubleVal)

名前空間のインポート

C#VB.NET
usingImports
C#using System.Collections.Generic;
VB.NETImports using System.Collections.Generic

構造体

C#

struct SomeStruct
{
    :
}

VB.NETStructure SomeStructure
    :
End Structure

Flags、FlagsAttribute

C#// Enum型をビット・フィールド化
[Flags] 
public enum SampleOptions
{
    A = 0x00,
    B = 0x01,
    C = 0x02,
}
VB.NET' Enum型をビット・フィールド化
<Flags()> _
Public Enum SampleOptions
    A = &H0
    B = &H1
    C = &H2
End Enum

Flags 属性(=FlagsAttribute クラス)を付けると、「ビットごとの OR 演算」が可能なビット・フィールドとして使えるようになる。Flags は FlagsAttribute の省略形。

クラスのプロパティ

非表示フィールドを自動実装

C#

public class SomeClass
{
    public int Num { get; set; }

    public SomeClass() //コンストラクタ
    {       
        Num = 0; //初期値
    }
}

VB.NETPublic Class SomeClass
    Public Property Num As Integer = 0
End Class

非表示フィールドを自動実装 (Read Only)

C#

public class SomeClass
{
    public int Num { get; private set; }
    // または
    // public int Num { get; }
    // または
    //public int Num { get; private set; } = 0;
    // または
    //public int Num { get; } = 0;

    public SomeClass() //コンストラクタ
    {
        Num = 0; //初期値
    }
}

VB.NETPublic Class SomeClass
    Public ReadOnly Property Num As Integer = 0
End Class

Read & Write

C#public class SomeClass
{
    private int _Num = 0;
    public int Num
    {
        get
        {
            return _Num;
        }
        set
        {
            _Num = value;
        }
    }
}
VB.NETPublic Class SomeClass
    Private _Num As Integer = 0
    Public Property Num() As Integer
        Get
             Return _Num
        End Get
        Set(ByVal value As Integer)
            _Num = value
        End Set
    End Property
End Class

Read Only

C#public class SomeClass
{
    private int _Num = 0;
    public int Num
    {
        get
        {
            return _Num;
        }
    }
}
VB.NETPublic Class SomeClass
    Private _Num As Integer = 0
    Public ReadOnly Property Num() As Integer
        Get
            Return _Num
        End Get
    End Property
End Class

Write Only

C#public class SomeClass
{
    private int _Num = 0;
    public int Num
    {
        set
        {
            _Num = value;
        }
    }
}
VB.NETPublic Class SomeClass
    Private _Num As Integer = 0
    Public WriteOnly Property Num() As Integer
        Set(ByVal value As Integer)
            _Num = value
        End Set
    End Property
End Class

条件分岐

switch vs Select

C#VB.NET
switch(~){
        :
    case ~
        :
    default:~
        :
}
Select Case ~
        :
    Case ~
        :
    Case Else ~
        :
End Select

if vs If

C#VB.NET
if (item == 1) {
    :
} else if (item == 2) {
    :
} else {
    :
}
If item = 1 Then
    :
ElseIf item = 2 Then
     :
Else
     :
End If

演算子

連結演算子

C#VB.NET
return s + ".txt";

Return s & ".txt" または Return s + ".txt"

論理演算子

C#VB.NET
&And
&&AndAlso
|Or
||OrElse
!(否定)Not

ビット演算子

C#VB.NET
|Or
&And
^Xor
~Not

三項演算子

C#Console.WriteLine( val == null ? "null" : val );
VB.NETConsole.WriteLine( If(val Is Nothing, "null", val) )

左の条件式が True の場合は中央の式が評価され、False の場合は右の式が評価される。

 

C#String msg = score <= 70 ? "うーん" : score >= 90 ? "いえい!" : "まぁまぁ";
VB.NETDim msg As String = If(score <= 70, "うーん", If(score >= 90, "いえい!", "まぁまぁ"))

入れ子にした三項演算子。

比較演算子

C#VB.NET
===
!=<>

算術演算子

割り算の余り

C#int num = 6 % 5; // = 1
VB.NETDim num As Integer = 6 Mod 5 ' = 1

System.Math.DivRem でも可。

インクリメント、デクリメント

C#VB.NET
i++;i += 1(C# の ++i; 相当の表現は無い)
i--;i -= 1(C# の --i; 相当の表現は無い)

反復処理

while vs While

C#VB.NET
while (num < 3)
{
    Console.WriteLine(num);
    num++;
}
Do While num < 3
    Console.WriteLine(num)
    num += 1
Loop
--------------------------
While num < 3
    Console.WriteLine(num)
    num += 1
End While

for vs For

C#VB.NET
for (int i = 1; i <= 5; i++)
{
    :
}
For i As Integer = 1 To 5
   :
Next

foreach vs For Each

C#VB.NET

var intList = new List<int>();
intList.Add(3);
intList.Add(2);
intList.Add(1);

foreach (int item in intList)
{
    if (item == 1) {
        break;
    } else if (item == 2) {
        continue;
    } else {
        MessageBox.Show(item.ToString());
    }
}

Dim intList = New List(Of Integer)
intList.Add(3)
intList.Add(2)
intList.Add(1)

For Each item As Integer In intList
    If item = 1 Then
         Exit For
    ElseIf item = 2 Then
         Continue For
    Else
        MessageBox.Show(item.ToString)
    End If
Next

デリゲート、無名関数

デリゲートとは、メソッドを参照するための型のこと。

MEMO

無名関数は匿名関数と呼ばれることもあるが、「匿名」には「隠す」の意味合いがあるので、あまり適切な表現とは言えないらしい。(「無名関数」のほうが好ましい)

delegate vs Delegate

C#

delegate int SampleDelegateType(int x, int y);

public int SampleFunc(int x, int y)
{
    return x + y;
}

public void Test()
{
    SampleDelegateType AnotherSampleFunc =
            new SampleDelegateType(SampleFunc);
    int result = AnotherSampleFunc(2, 5);
    MessageBox.Show(result.ToString());
}

VB.NET

Delegate Function SampleDelegateType(x As Integer, y As Integer) As Integer

Public Function SampleFunc(x As Integer, y As Integer) As Integer
    Return x + y
End Function

Public Sub Test()
    Dim AnotherSampleFunc As SampleDelegateType = _
            New SampleDelegateType(AddressOf SampleFunc)
    Dim result As Integer = AnotherSampleFunc(2, 5)
    MessageBox.Show(result.ToString())
End Sub

Action(戻り値の無いメソッド)

C#// メソッド SomeFunc を参照する Action 型のデリゲートを作成
Action SomeFuncDelegate = new Action(SomeFunc);
Action SomeFuncDelegate = (Action)SomeFunc;
Action SomeFuncDelegate = SomeFunc;
VB.NET' メソッド SomeFunc を参照する Action 型のデリゲートを作成
Dim SomeFuncDelegate As New Action(AddressOf SomeFunc)
Dim SomeFuncDelegate As Action = AddressOf SomeFunc
C#// string 型の引数を取るメソッドのデリゲート
Action<string> SomeFuncDelegate = new Action<string>(SomeFunc);
// 実行
SomeFuncDelegate("some string");
VB.NET' String 型の引数を取るメソッドのデリゲート
Dim SomeFuncDelegate As New Action(Of String)(AddressOf SomeFunc)
Dim SomeFuncDelegate As Action(Of String) = AddressOf SomeFunc
' 実行
SomeFuncDelegate("some string") 
C#Action helloWorld = () => MessageBox.Show("hello world");
helloWorld();
VB.NETDim helloWorld As Action = Sub() MessageBox.Show("hello world")
Call helloWorld

Func(戻り値のあるメソッド)

C#Func<int, int, string> FuncTest = (a, b) => ("Result: " + (a + b).ToString());
MessageBox.Show(FuncTest(1, 2));
VB.NETDim FuncTest As Func(Of Integer, Integer, String) = Function(a, b)("Result: " & (a + b).ToString)
MessageBox.Show(FuncTest(1, 2))

LINQ、ラムダ式

MEMO

LINQ = 統合言語クエリ (Language-Integrated Query)

MEMO

=> は「ラムダ演算子(lambda operator)」「ラムダ宣言子(lambda declarator)」「ラムダ宣言演算子(lambda declaration operator)」「アロー演算子(arrow operator)」「 goes to」「go to」等 と読む。

C#VB.NET
()=> 式Function() 式
   または
Sub() 式
(i) => i + j
//引数 i を取る無名関数が i + j の結果を返す。
Function(i) i + j
() =>
{
    Return something;
}
Function()
    Return something
End Function
() =>
{
    DoNotReturn;
}
Sub()
    DoNotReturn
End Sub
(n) =>
{
    Return n * 100;
}
Function(n)
    Return n * 100
End Function
C#button1.Click += (sender, e) => MessageBox.Show("ラムダ式");
VB.NETAddHandler Button1.Click, Sub(_sender, _e) MessageBox.Show("ラムダ式")
C#

button1.Click += (sender, e) =>
    {
        MessageBox.Show("!");
    };

VB.NETAddHandler Button1.Click, _
    Sub(_sender, _e)
        MessageBox.Show("!")
    End Sub

(例)List.Where

C#List<int> list = new List<int> {1,2,3,4,5,6,7,8,9,10,};
IEnumerable<int> result = list.Where((n) => n % 2 == 0);
C#List<int> list = new List<int> {1,2,3,4,5,6,7,8,9,10,};
IEnumerable<int> result = list.Where(n => n % 2 == 0);
VB.NETDim list As List(Of Integer) = New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Dim result As IEnumerable(Of Integer) = list.Where(Function(n) n Mod 2 = 0)

list の各要素を無名関数の引数 n に渡し、n を 2 で割った余りが 0 になる要素のコレクションを返す。

C#void TestSub()
{
    List<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, };
    IEnumerable<int> result = list.Where(TestFunc);
}
-----
bool TestFunc(int n)
{
    return (n % 2 == 0);
}
VB.NETSub TestSub
    Dim list As List(Of Integer) = New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    Dim result As IEnumerable(Of Integer) = list.Where(AddressOf TestFunc)
End Sub
-----
Function TestFunc(n As Integer) As Boolean
     Return (n Mod 2 = 0)
End Function

(例)OrderBy

C#wordArray.OrderBy(n => n.Length)
VB.NETwordArray.OrderBy(Function(n)  n.Length)

wordArray の要素を n に入れてイテレートし、n のテキスト長でソート。

 

C#wordArray.OrderBy(n => n.Length).ThenBy(n => n)
VB.NETwordArray.OrderBy(Function(n)  n.Length).ThenBy(Function(n) n)

wordArray の要素を n に入れてイテレートし、n のテキスト長でソートし、更にあいうえお順でソート

NULL

NULL の判定

C#VB.NET
if (val == null) {
    ...
}
If val Is Nothing Then
    ...
End If
if (val != null) {
    ...
}
If val IsNot Nothing Then
    ...
End If

NULL 合体演算子

C#MessageBox.Show(val ?? "null");
VB.NET(相当する演算子は無い)
MessageBox.Show(If(val Is Nothing, "null", val))

?? 演算子の左辺が NULL の場合は右辺の式で評価され、NULL 以外の場合は左辺の値が使用される。

C#var result = 1 + val ?? 2;
NULL 合体演算子は優先順位が低いので、先に 1 + val が計算され、result = 2 になる。
VB.NET(相当する演算子は無い)
Dim val As Integer? = Nothing
Dim result = If(1 + val Is Nothing, 2, val)

NULL 合体代入

C#s ??= "some string";
C# 8.0 より。
VB.NET(相当する演算子は無い)

s が NULL ならば、"some string" を代入。

NULL 条件演算子

C#Console.WriteLine(numbers?.Length);
VB.NETConsole.WriteLine(numbers?.Length)

numbers が NULL の場合は NULL を返し、そうでない場合はメンバ Length の値を返す。

 

C#Console.WriteLine( numbers?[0] );
VB.NETConsole.WriteLine( numbers?(0) )

numbers が NULL の場合は NULL を返し、そうでない場合はインデックス 0 のメンバの値を返す。

NULL 許容型

C#int? val = null;
VB.NETDim val As Integer? = Nothing

通常は NULL 値を格納できない値型の型名の後ろに ? をつけて NULL 値を格納できるようにする。

C#void Foo(TimeSpan? span = null)
{
    :
}
VB.NET

Sub Foo(Optional span As TimeSpan? = Nothing)
    :
End Sub

拡張メソッド

C#public static int Add(this int m, int n)
    => m + n;
VB.NET'Extension属性を付加するのに必要
'Imports System.Runtime.CompilerServices

<Extension()>
Public Function Add(m As Integer, n As Integer) As Integer
    Return m + n
End Function

クラス自体は変更せず、そのクラスにインスタンスメソッドが追加されたように見せかけるもの。サンプルコードの第一引数の型が拡張される型。C# の場合は型の前に this を付ける。

 

C#public static bool In(this string str, params string[] param) {
    return param.Contains(str);
}
VB.NET'Extension属性を付加するのに必要
'Imports System.Runtime.CompilerServices

<Extension()> _
Public Function [In](ByVal str As String, ParamArray ByVal params As String()) As Boolean
    Return params.Contains(str)
End Function

上記 VB.NET サンプルの [In] について:
コード内に記述するクラスやメソッド、変数などの識別子には、通常、その言語で予約されているキーワードと同じ名前を使用できない。しかし、C# では識別子の前に @ を付けることにより、VB.NETでは識別子を角カッコ [ ] で挟むことにより、キーワードを識別子として使用できる。これらの識別子は、C#では「逐語的識別子」、VB.NETでは「エスケープ識別子」と呼ばれる。

Win 32 API、DLL

C#//using System.Runtime.InteropServices;
[DllImport("kernel32.dll", SetLastError=true)] private extern static bool Beep(uint dwFreq, uint dwDuration);
VB.NET'Imports System.Runtime.InteropServices
<DllImport("kernel32.dll", SetLastError := True)> _
Private Function Beep (ByVal dwFreq As Integer, ByVal dwDuration As Integer) As Boolean
End Function

C# の場合、DllImport 属性を付けた Win32 API や DLL 関数の宣言では、関数の実体が外部にあることを表す extern 修飾子と、静的なメンバであることを表す static 修飾子を必ず指定する。
VB.NET では C# の extern に相当する表現は不要。

C#[DllImport("kernel32.dll", CharSet=CharSet.Auto)] static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData);
VB.NET<DllImport("kernel32.dll", CharSet := CharSet.Auto)> _
Private Shared Function FindFirstFile(ByVal lpFileName As String, ByRef lpFindFileData As WIN32_FIND_DATA) As IntPtr
End Function

ジェネリック

ジェネリック クラス

C#public class MyGenericClass<T>
{
    List<T> _list = new List<T>();
    // Addメソッド
    public void Add(T item)
    {
        _list.Add(item);
    }
        :
}
VB.NETPublic Class MyGenericClass(Of T)
    Dim _list As New List(Of T)
    'Addメソッド
    Public Sub Add(ByVal item As T)
        _list.Add(item)
    End Sub
        :
End Class

ジェネリック メソッド

C#

static void SomeGenericMethod<T>(IEnumerable<T> collection)
{
   :
}

VB.NETSub SomeGenericMethod(Of T)(collection As IEnumerable(Of T))
    :
End Sub
C#T SomeGenericMethod<T>() {
    :
}
VB.NETFunction SomeGenericMethod(Of T)() As T
    :
End Function

その他

説明C#VB.NET
コメント//'
ブロックコメント/* ... */なし
XML コメント///'''
コレクションの要素へのアクセス[ ]( )
逐次的リテラル文字列@

//エスケープシーケンスの無効化
@".¥aaa¥bbb¥ccc.txt"
//複数行にわたって文字列を書く
@"aaa
   bbb
   ccc
"

該当なし
領域指定#region TitleString
    :
#endregion
#Region "TitleString"
    :
#End Region
排他的ロックlock (lockObject)
{
    :
}

SyncLock lockObject
    :
End SyncLock

C#VB.NET
@text
(例)string @string = "abc";
[text
(例)Dim [String] As String = "abc"
予約語を識別子(変数)として使えるようにする。C#では「逐語的識別子」、VB.NETでは「エスケープ識別子」と呼ばれる。
C#VB.NET
obj.GetType()obj.GetType()
現在のインスタンスの System.Type を取得
C#VB.NET
typeof(<型>)
(例)typeof(string)
(VB.NET の TypeOf との違いに注意)
GetType(<型>)
(例)GetType(String)
指定された<型>の System.Type オブジェクトを返す
C#VB.NET
if (arrayVar is Array)
{
    ...
}
If TypeOf arrayVar Is Array Then
    :
End If
(C# の typeof との違いに注意)
変数の型をチェックする、キャスト可能か調べる
C#VB.NET
該当なし(<変数>.GetType().Name)TypeName(<変数>)
指定した変数のデータ型名を文字列型 (String) で返す

 

C#VB.NET
thisMe
現在実行中のインスタンスにアクセスする
C#VB.NET
baseMyBase
呼びだされた派生クラスのひとつ上の基底クラスにアクセスする
C#VB.NET
該当なしMyClass
呼び出されたクラスにアクセスする

Me / MyBase / MyClass の違いを実感するには、じゃんぬねっと様のこちらの記事「VB.NET の Me、MyClass、MyBase の違い」で紹介されているコードサンプルが分かりやすいと思います。

 

C#

static void SomeMethod<T>(IEnumerable<T> collection)
{
   :
}

VB.NETSub SomeMethod(Of T)(collection As IEnumerable(Of T))
    :
End Sub

参考にした記事

dobon.net - VB.NET、C#変換表@IT、その他多数。

ありがとうございました。

コメントの投稿

avatar
  購読する  
通知を受け取る対象