2

VB で型を比較す​​る場合、次は期待どおりに機能し、現在のインスタンスを特定の継承されたクラスと比較できるようにします。この場合は( LINQPadFalseからのスニペット)を返します。

Sub Main
    Dim a As New MyOtherChildClass

    a.IsType().Dump()
End Sub

' Define other methods and classes here
MustInherit class MyBaseClass
    Public Function IsType() As Boolean
        Return TypeOf Me Is MyChildClass
    End Function
End Class

Class MyChildClass 
    Inherits MyBaseClass
End Class

Class MyOtherChildClass
    Inherits MyBaseClass
End Class

ただし、ジェネリックが導入されると、VB コンパイラはエラーで失敗します。Expression of type 'UserQuery.MyBaseClass(Of T)' can never be of type 'UserQuery.MyChildClass'.

' Define other methods and classes here
MustInherit class MyBaseClass(Of T)
    Public Function IsType() As Boolean
        Return TypeOf Me Is MyChildClass
    End Function
End Class

Class MyChildClass 
    Inherits MyBaseClass(Of String)
End Class

Class MyOtherChildClass
    Inherits MyBaseClass(Of String)
End Class

C#の同等のコードは、コンパイルして比較を許可し、正しい結果を返します。

void Main()
{
    var a = new MyOtherChildClass();

    a.IsType().Dump();
}

// Define other methods and classes here

abstract class MyBaseClass<T>
{
    public bool IsType()
    {
        return this is MyChildClass;
    }
}

class MyChildClass : MyBaseClass<string>
{
}

class MyOtherChildClass : MyBaseClass<string>
{
}

VB コンパイラがこの比較を許可しないのはなぜですか?

4

2 に答える 2

0

私は C# には精通していますが、VB にはあまり詳しくありません。ただし、VB コードの例と C# コードの例は異なるようです。使用する VB の例Return TypeOf Me Is MyChildClassでは、C# では になりますreturn typeof(this) is MyChildClass;。しかし、(おそらく動作している) C# の例にはreturn this is MyChildClass;.

TypeOf Me Is MyChildClass左側のインスタンス式( )Typeを右側の型 ( ) として宣言された変数に割り当てることができるかどうかを尋ねていると思いますMyChildClass。フレームワーククラスTypeはあなたとの接続がないため、MyChildClassこれは不可能であり、コンパイラが警告またはエラーでキャッチできる可能性のある間違いです-おそらくあなたが得ているものです。

代わりに、VB コードは C# の例と一致する必要があると思いますReturn Me Is MyChildClass。これは、インスタンス Me を として宣言された変数に割り当てることができるかどうかを正しく確認する必要がありますMyChildClass。この構文が使用されている場合でも VB は反対しますか?それともエラーを修正して正しい動作を取得しますか?

于 2017-05-22T23:24:51.533 に答える