-1

C# から VB.NET に関連する C# コードは次のとおりです。

namespace MyApp {
   public delegate bool AllocHandlerDelegate(int param1);

   public interface ILoader  {
    event AllocHandlerDelegate evAlloc;
    bool Load();
    }

   public class MyLoader : ILoader  {
    public event AllocHandlerDelegate evAlloc;

        public bool Load() {
            try  {
           if (this.evAlloc != null && !evAlloc(1))
                          return false;
        }
   }
}

これが私がこれまでに思いついたものです。C# デリゲートは、ブール値の結果を返す関数です。そこでデリゲート定義とイベント宣言を以下のように変換しました。

    Public Delegate Function AllocHandlerDelegate(ByVal param1 As Integer) As Boolean
    Public Event evAlloc As AllocHandlerDelegate

Visual Studio で次のエラー メッセージが返される: "戻り値の型を持つデリゲート型でイベントを宣言することはできません。"

代わりにSUBにして、このように翻訳を完成させました*。

Namespace MyApp
    Public Delegate Sub AllocHandlerDelegate(ByVal param1 As Integer)

    Public Interface ILoader
        Event evAlloc As AllocHandlerDelegate

    Function Load() As Boolean
    End Interface

    Public Class MyLoader
        Implements ILoader

        Public Event evAlloc As AllocHandlerDelegate Implements ILoader.evAlloc

        Public Function Load() as Boolean Implements ILoad.Load
            Try
                    If Me.evAllocEvent IsNot Nothing AndAlso Not evAlloc(1) Then
                        Return False
            End Try
        End Function
    End Class
End Namespace

*注: 「イベント」オブジェクトが何もないことを確認できず、VB 内部デリゲート オブジェクト * EVENTNAME *Event を確認できないことに既に気付きました。

しかし、2番目の部分では、それをどうするかわかりません。そこで、次のエラー メッセージが表示されます。 「Public Event evAlloc (param1 As Integer)」はイベントであり、直接呼び出すことはできません。「RaiseEvent」ステートメントを使用してイベントを発生させます。

何か案は?!ありがとうございました

4

2 に答える 2

1

エラーメッセージは非常に明確です:

Public Event evAlloc (param1 As Integer)' はイベントであり、直接呼び出すことはできません。「RaiseEvent」ステートメントを使用してイベントを発生させます。

これはイベントです。直接呼び出すことはできません。代わりに「RaiseEvent」ステートメントを使用します。

RaiseEvent evAlloc(1)

イベントは値を返すことはできませんが (C# の同等のものは返すことができます)、代わりにプレーンなデリゲートを使用できます。

Public Delegate Function AllocHandlerDelegate(ByVal param1 As Integer) As Boolean

Public Interface ILoader
    Property evAlloc As AllocHandlerDelegate
    Function Load() As Boolean
End Interface

Public Class MyLoader
    Implements ILoader

    Public Property evAlloc As AllocHandlerDelegate Implements ILoader.evAlloc

    Public Function Load() as Boolean Implements ILoader.Load
            If Me.evAlloc IsNot Nothing AndAlso Not evAlloc(1) Then _
                Return False
            ' Do Stuff '
            Return True
    End Function
End Class

イベントは複数のサブスクライバーを持つ可能性があり、おそらくどの値が返されるかわからないため、値を返すイベントを使用するのは良くありません。

于 2013-08-15T09:30:37.267 に答える
-1

これは VB バージョンです。これらのインライン関数にはフレームワーク 4.0 以降が必要です...

    ILoader.evAlloc = Function(rows As Object)
                                 Dim p As Person = TryCast(rows, Person)
                                 If (p.Age And 1) Then
                                     Return 0
                                 Else
                                     Return 1
                                 End If
                             End Function

「2010」を読んでいませんでした。使用する必要があります。

 yourfunction.yourevent = New eventype(AddressOf yourfunction)

または使用;

 addhandler

http://msdn.microsoft.com/en-us/library/6yyk8z93(v=vs.90).aspx

于 2013-08-15T07:40:15.183 に答える