Pascal (16 ビットでコンパイル) で記述されたゲームを C# に移植しています (したがって、XP より新しいマシンで実行されます)。私が収集したものから、Pascal では、次のような構文を使用して、ユニット/プログラムの型セクションで型定義を行うことができます。
type
BaseArrayPtr = ^BaseArray;
BaseArray = array [1 .. 5, 1 .. 5] of Integer;
SubArray = array [0 .. 3] of BaseArray;
残念ながら、C# で型定義を行うことは不可能であることもわかりました。ただし、回避策を試しています。これまでのところ、これは私が持っているものです:
BoundedArray.cs:
using System;
using System.Collections;
namespace test
{
abstract class BoundedArray<T>
{
public BoundedArray()
{
m_data = null;
}
public T this[params int[] index]
{
get
{
if (index.Length != m_data.Rank)
throw new IndexOutOfRangeException();
return (T) m_data.GetValue(index);
}
set
{
if (index.Length != m_data.Rank)
throw new IndexOutOfRangeException();
m_data.SetValue(value, index);
}
}
protected void SetAttributes(int[] lowerBounds, int[] lengths)
{
if (lengths.Length != lowerBounds.Length)
throw new ArgumentException();
m_lowerBounds = lowerBounds;
m_lengths = lengths;
m_data = Array.CreateInstance(typeof(T), m_lengths, m_lowerBounds);
m_data.Initialize(); // Should (but doesn't) initialize every element in m_data
}
Array m_data;
int[] m_lengths;
int[] m_lowerBounds;
}
}
test.cs:
using System;
namespace test
{
class Program
{
public static int[] ints(params int[] values)
{
return values;
}
class BaseArray : BoundedArray<int>
{
public BaseArray()
{
SetAttributes(ints(2, 2), ints(1, 2));
}
}
class SubArray : BoundedArray<BaseArray>
{
public SubArray()
{
SetAttributes(ints(4), ints(2));
}
}
static void Main(string[] args)
{
SubArray subArray = new SubArray();
Console.Read();
}
}
}
をチェックしましたがbaseArray
、 のデフォルト値m_data
は s であるためゼロint
です。ただし、 ではsubArray
、 のデフォルト値m_data
は nullです。BaseArray
の配列内のインスタンスはsubArray
、何らかの理由で初期化されていません。デフォルトのコンストラクターを実行するにはどうすればよいですか?
m_data.Initialize();
編集:現時点での本当の問題は、SetAttributes
メソッドですべての要素を初期化しないのはなぜm_data
ですか? MSDNのドキュメントは、それがすべきことを示しているようです...
編集:だから、問題はSystem.Array.Initialize
値型でのみ機能すると思います。クラスは C# の参照型であるため、System.Array.Initialize
何もしません。したがって、可変次元、長さ、および下限の参照型配列を初期化する方法を見つける必要があります。