投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/9/3 22:46:23
>  Me.ShapeContainer1.Shapes[0] 
> と入力すると、
> 「CS0020 角かっこ [] 付きインデックスを 'type' 型の式に適用することはできません」

えぇと…??? 質問内容に混乱が見られるような。
◾ CS0020 は確かに C# コンパイラのエラーコードですが、その意味は
 「定数 0 による除算」だったはずです。 CS0021 の間違いではありませんか?

◾ C# に Me というキーワードはありません。this の間違いではありませんか?

◽ Visual Basicの命名ルールが何故か引き継がれているようですね。
 Visual Basicで作られたデザイン情報を、たとえばクリップボードを使うなどして
 C# 側に移植したということでしょうか?  Name プロパティの初期設定は
 PascalCase 表記な ShapeContainer1 が Visual Basic デザイナによるもので
 camelCase 表記な shapeContainer1 が C# デザイナのものとなるはずなので…。


> VC# で同様のことができるか教えて下さい。

Microsoft.VisualBasic.PowerPacks.ShapeCollection クラスはインデクサを有していません。
『インデクサ』ではなく、『引数付きプロパティ』として実装されています。
https://docs.microsoft.com/en-us/previous-versions/bb917992

Visual Basic 側の文法で言えば、
Default Public Property Item(index As IntegerAs Object
は持ち合わせていない、ということです。ただし
Public Property Item(index As IntegerAs Object Implements IList.Item
であれば実装されています。


見ての通り、IList が実装されていますので、引数付きプロパティをサポートしていない C# であっても、
  dynamic shape = ((System.Collections.IList)this.shapeContainer1.Shapes)[0];
のように、IList を通じてアクセスすることが可能です。

あるいは、動的言語サポートを通じて、
  dynamic shapes = this.shapeContainer1.Shapes;
  dynamic shape = shapes[0];
  shapes[0] = shape;   // 使わないとは思うけれど、代入操作も可能
のように書くこともできます。



そのほか、引数付きプロパティを持つクラスが C# 側に引き渡された場合、
getter / setter のメソッドを通じてアクセスすることができます。たとえば、

'Dim shape As Object = Me.ShapeContainer1.Shapes(0)
Dim shape As Object = Me.ShapeContainer1.Shapes.Item(0)
Me.ShapeContainer1.Shapes.Item(0) = shape

に相当するコードを C# では

dynamic shape = this.shapeContainer1.Shapes.get_Item(0);
this.shapeContainer1.Shapes.set_Item(0, shape);

のように書けます。
https://ufcpp.net/blog/2016/12/tipsimplicitmembers/


ちなみに Visual Basic 側でも、サポートされていない演算子のオーバーロードを呼び出すために、
このような代替名でのアクセスが必要になるケースがあるのですが…それはまた別のお話。