8
Public Class MyList
    Inherits List(Of MyObject)

    Public ReadOnly Property SelectedCount() As Integer
        Get
            Return Me.Count(Function(obj) obj.IsSelected)
        End Get
    End Property
End Class

上記のコードにより、コンパイル時エラーが発生します。ご覧のとおり、拡張メソッドを使用しようとしていますCount(<predicate>)Listエラーは、クラス自体にも同様の名前のプロパティ Count があり、拡張メンバーが隠されているためだと思います。

ここでの私の質問は次のとおりです。

  1. Count拡張メソッドにアクセスするには、クラスを別のものに明示的にキャストする必要がありますか? もしそうなら、上記のシナリオでは正確にどのクラスが必要ですか?

  2. プロパティではなくメソッドを参照しているとコンパイラが推測できないのはなぜですか?

  3. これが頻繁に使用されるメソッドであることを考えると、キャスティングには大きなオーバーヘッドが伴いますか (1 秒間に数百回呼び出されることもあります)。

  4. この点で、C# は VB.NET より優れていますか?

何か関係がある場合は、VS2010で.NET 4.0を使用しています。

編集

エラーメッセージ:

' Public ReadOnly Property Count As Integer' にはパラメーターがなく、戻り値の型にインデックスを付けることができません。

4

4 に答える 4

5
  1. 次の場所にキャストできMeますIEnumerable(Of MyObject):

    Return DirectCast(Me, IEnumerable(Of MyObject)).Count(Function(obj) obj.IsSelected)
    

    またはEnumerable.Count()メソッドを直接使用します。

    Return Enumerable.Count(Me, Function(obj) obj.IsSelected)
    

    拡張メソッドは、コンパイラによって直接の静的 ( sharedVB の) メソッド呼び出しに変換されるため、違いはありません。

  2. 本当にわからない。

  3. 基になる型へのキャストはオブジェクト自体を変更しないため、パフォーマンスの低下はありません (boxing関係しない限り、ここでは当てはまりません)。

  4. C# ではパラメーター付きのプロパティを使用できず、プロパティを なし()で呼び出す必要があるため、このような状況ではより適切です。

    VB.NET では両方とものプロパティをMe.Count()参照Me.Countしてください)。C# では、プロパティを参照し、拡張メソッドを参照します (括弧のため)。CountList(Of Tthis.Countthis.Count()

于 2013-09-11T14:14:23.673 に答える
1

#4に答えるには、これはC#でうまく機能します:

public class MyObject { public bool IsSelected { get { return true; } } }

public class MyList : List<MyObject>
{
    public int SelectedCount
    {
        get { return this.Count(x => x.IsSelected); }
    }
}
于 2013-09-11T14:13:24.023 に答える