0

私はSilverlightを初めて使用し、以前はVB.Netでコーディングしていました。ここで、1つのステートメントでRepeatButtonsのInterval値を割り当てようとしていますが、ゼロに設定されています。

rbtUp.Interval = rbtLeft.Interval = rbtCenter.Interval = rbtRight.Interval
= rbtDown.Interval = interval

これはc#では正常に機能しますが、vb.netでは機能しません。

4

3 に答える 3

5

VB.NetとC#を混同しています。

VB.Netでやろうとしていることはできません。複数のステートメントを書く必要があります:

rbtUp.Interval = interval
rbtLeft.Interval = interval
rbtCenter.Interval = interval
rbtRight.Interval = interval
rbtDown.Interval = interval

あなたの場合、最初の等号だけが代入演算子であり、後続の等号は比較演算子です。同等のC#では、次のようになります。

rbtUp.Interval = rbtLeft.Interval == rbtCenter.Interval == rbtRight.Interval == rbtDown.Interval == interval;

これは明らかにあなたがやりたかったことではありません。

また、Option Strictがオンになっていないようです(比較演算子はブール値を返し、Intervalは整数である可能性が高いため、整数にブール値を割り当てると、コードはOption Strict Onでコンパイラエラーを表示するはずです)。

于 2012-11-07T15:31:55.030 に答える
2

これを試して

Sub Main
    Dim outer As Integer = -1
    Dim inner1 As Integer
    Dim inner2 As Integer
    Dim inner3 As Integer
    Dim inner4 As Integer

    inner1 = inner2 = inner3 = inner4 = outer
    Console.WriteLine("{0},{1},{2},{3},{4}", inner1, inner2, inner3, inner4, outer)

End Sub

結果は

0,0,0,0,-1

したがって、C#のようにVB.NETでは機能しません

VB.NETとC#のILコードの違いを知りたいと思いました。
ILコードを見ると、VB.NETでサポートが不足している理由は明らかです。

VB.NETILコード

IL_0001:  ldc.i4.m1   
IL_0002:  stloc.s     04 
IL_0004:  ldloc.1     
IL_0005:  ldloc.2     
IL_0006:  ceq         
IL_0008:  ldc.i4.0    
IL_0009:  cgt.un      
IL_000B:  neg         
IL_000C:  ldloc.3     
IL_000D:  ceq         
IL_000F:  ldc.i4.0    
IL_0010:  cgt.un      
IL_0012:  neg         
IL_0013:  ldloc.s     04 
IL_0015:  ceq         
IL_0017:  ldc.i4.0    
IL_0018:  cgt.un      
IL_001A:  neg         

同等の例のC#ILコード

IL_0001:  ldc.i4.m1   
IL_0002:  stloc.0     
IL_0003:  ldloc.0     
IL_0004:  dup         
IL_0005:  stloc.s     04 
IL_0007:  dup         
IL_0008:  stloc.3     
IL_0009:  dup         
IL_000A:  stloc.2     
IL_000B:  stloc.1     

VBバージョンは値の比較を続けるため、問題はVB.NETでは二重の意味を持つ=演算子です。この場合、割り当てるのではなく比較するために使用されます。

于 2012-11-07T15:28:58.977 に答える
2

この機能はC#非常に優れていると思ったので、同じことを行うためにVB拡張メソッド( )を作成しました。セマンティクスは非常に簡単に理解できます。任意の値を呼び出して、それを他の複数の変数に割り当てるだけです。AssignAssign

Call True.Assign(b1, b2, b3)
Call 4.1.Assign(d1, d2, d3)

等...

コードは次のとおりです。

Imports System.Runtime.CompilerServices


Namespace Utility
    Public Module MultiAssignExtensionMethod
        ' Multiply assign the same value to 1 (required) or more variables
        <Extension()> _
        Public Function Assign(Of T)(this As T, ByRef first As T, Optional ByRef second As T = Nothing, Optional ByRef third As T = Nothing,
                                    Optional ByRef forth As T = Nothing, Optional ByRef fifth As T = Nothing, Optional ByRef sixth As T = Nothing,
                                    Optional ByRef seventh As T = Nothing, Optional ByRef eighth As T = Nothing, Optional ByRef nineth As T = Nothing,
                                    Optional ByRef tenth As T = Nothing) As T
                            ' I would LIKE to do this as a ParamArray, but it doesn't allow references for basic types....grrr
            first = this
            second = this
            third = this
            forth = this
            fifth = this
            sixth = this
            seventh = this
            eighth = this
            nineth = this
            tenth = this

            Return this     ' For use as assignment and evaluation as Function parameter
        End Function
    End Module
End Namespace
于 2015-10-12T18:24:33.177 に答える