3

オブジェクトへの参照の一般的なリストを作成しようとしていPointFます。(いいえ、オブジェクトの一般的なリストを作成するつもりはありませんPointF。)ただし、次の行はコンパイルに失敗します。

Generic::List<PointF^> ^pointList; // Generates error C3225

一方、PointF参照の配列の作成は、次のように問題なく機能します。

array<PointF^> ^points = gcnew array<PointF^>;

サンプルプログラムは次のとおりです。

using namespace System;
using namespace System::Drawing;
namespace Generic = System::Collections::Generic;

int main(array<System::String ^> ^args)
{

    array<PointF^> ^points = gcnew array<PointF^>{
        nullptr, PointF(0.0f, 0.0f), PointF(1.0f, 0.0f), nullptr
    };

    Generic::List<PointF^> ^pointList;
    Console::WriteLine(L"Hello World");
    return 0;
}

参照の一般的なリストを作成するにはどうすればよいPointFですか? つまり、ボックス化された s の一般的なリストを作成するにはどうすればよいPointFですか?

4

4 に答える 4

5

これは、値型や参照型への参照などの CLI 準拠型のみを使用する .Net ジェネリックの制限です。ref 型のスタック セマンティクス (確定的なファイナライズにコンパイルされる) のような C++/CLI 固有の型や、ボックス化された値型への参照は必要ありません。

配列は CLI にネイティブであり、この制限はありません。

于 2009-10-24T01:29:54.430 に答える
0

タイプの格納場所PointFとによって参照されるヒープオブジェクトPointF^は異なる種類のものですが、どちらも同じTypeオブジェクトによって記述されます。システムは通常Type、タイプの使用方法に基づいて、aが表すものの種類を決定します。タイプを使用して保管場所を記述する場合PointF、その保管場所は構造を保持するために割り当てられます。C ++ / CLIコンパイラはPointF^変数の宣言を許可できますが、フレームワークにはそのような概念がありません。C ++ / CLIコード内で、コンパイラはタイプの格納場所を使用してヒープオブジェクトObjectへの参照を保持するか、またはPointFObject[]そのような参照の束を保持するため。そのような場所が外部に公開されることがなく、コンパイラがPointF参照以外のものを格納しない場合、コンパイラは、null以外の参照のターゲットが安全に使用される可能性があることを知ることができますPointF。ただし、型システムには、他のコードをPointF参照の格納に限定する必要があることを示す手段がないため、コンパイラはそのような格納場所を外部コードに公開できません。

于 2013-02-06T17:54:20.183 に答える
0

PointFクラスではなく、構造体です。オブジェクト内にボックス化しないと、構造体への参照を持つことはできません。

参照のリストを持っていて、それを使用するたびObjectに参照をアンボックスするか、値をカプセル化するカスタム クラスのリストのいずれかを使用できます。PointFPointF

値との間の暗黙的な変換によりPointF、ボックス化とボックス化解除を透過的にすることができます。C++ でどのように記述するかはわかりませんが、C# では次のようになります。

public class PointFObject {

   // encapsulated PointF structure
   private PointF _value;

   // constructor
   public PointFObject(PointF value) {
      _value = value;
   }

   // implicit conversion to a PointF value
   public static implicit operator PointF(PointFObject obj) {
      return obj._value;
   }

   // implicit conversion from a PointF value
   public static implicit operator PointFObject(PointF value) {
      return new PointFObject(value);
   }

}

PointFObject のリストを作成し、それらに PointF 値のリストとしてアクセスできます。

List<PointFObject> pointList = new List<PointFObject>();
pointList.Add(new PointF(0f, 0f));
PointF p = pointList[0];
于 2009-10-13T07:54:16.180 に答える