2012-11-23 10 views
5

次のクラスとデリゲートがコード内に定義されています(簡潔にするために他の多くの行が抜粋されています)。私は次のコードで、タイマーの新しいインスタンスを作成するときデリゲートの署名が一致しないときにエラーなし

Public Delegate Sub TimerCallback(canceled As Boolean) 

Public Class Timer 
    Implements TimerManager.ITimer 

    Public Sub New(delay As Integer, callback As TimerCallback) 
     mState = TimerState.Setup 
     mCallback = callback 
     CType(TimerManager.Instance, TimerManager.ITimerManager).RegisterTimer(Me, delay) 
    End Sub 
End Class 

、私は無名関数のシグネチャはそれが欠けている(デリゲートの署名と一致していなくても、コンパイルエラーを取得しないでください」ブール値 "param"として取り消されました)。

Dim timer As New Timer(Me.CookTime, Sub() 
             Dim cooked As FoodBase = CType(Activator.CreateInstance(SuccessfulResult), FoodBase) 
             player.GetBackpack.AddItem(cooked) 
            End Sub) 

私はそれがエラーなしでコンパイルされた理由を誰が説明することができ、タイマーをこのようにインスタンス化するとき、コンパイルエラーが出ることを期待?コンパイルエラーが発生するように設定できるオプションはありますか?私はオプションを明示的に、オプションを厳密に、そしてオプションをプロジェクトプロパティで推論しています。それはキャンセルされた議論を含めるのを忘れてしまうのは簡単なことです。

答えて

4

イエップ。コンパイラは、匿名のメソッドを生成することができます。シグネチャが必要です。与えられたパラメータは使用しないでください。したがって、コンパイラ生成メソッドパラメータを持っています - はそれを使用しません。あなたはdelegate { ... }を使ってC#で同じことをすることができます。

+1

メソッドのシグネチャが一致するように、TimerCallbackの引数を強く入力するのはポイントではありませんか? Option InferがOnに設定されていると、この動作が発生する可能性があります。しかし、Option Inferをオフに設定すると、コンパイラが何かを推定して署名を強制することはないと思います。あなたは、この状況でエラーを生成するためにコンパイルを強制するか、少なくとも警告を出すのかという私の質問の2番目の部分に対する解決策はありますか? –

3

この現象はRelaxed Delegate Conversionと呼ばれ、Option Strictがon,offの場合、わずかに異なる動作をします。詳細については、リンクをたどってください。

それはこのような、コンパクトなコードすることができますVBの機能です:

Private Sub Form1_Load() Handles MyBase.Load 

あなたがいずれかの引数を使用していない場合は、なぜそれらすべてを宣言?私は個人的には問題ではなく、VBの利点としてそれを見ています。 C#で同じことをしようとすると、次のようなコンパイルエラーが発生します。

'Form1_Load'のオーバーロードは、 'System.EventHandler'デリゲートと一致しません。

+0

引数は/ this/exampleでは使用されていませんが、他の場所で使用できます。マイタイマーコードは、他の人が自分のプロジェクトで使用できるライブラリの一部です。これらのユーザーがTimerCallbackのシグネチャを認識していない場合、そのユーザーはそれを無視したり、タイマーをキャンセルする機能を知ることさえできます。 –

+1

@BradleyUffner:VBでは、パラメータが必要な場所でのみパラメータを使用して宣言できます。このような方法で、異なる署名を持つ複数のイベントを処理することもできます(ログの目的やデバッグなど)。ユーザーは、製品を使用する前にマニュアルを読む必要があります。その後、常にフルシグネチャを指定するか、必要に応じて短縮するかは選択肢です。詳細は私の編集を参照してください。 – Neolisk

+0

この機能の追加情報と実際の正式名称をありがとうございます。 –

関連する問題