2016-12-11 23 views
1

どうしたのですか?テンプレート型のサイズを調べる方法

int SizeOf<T> (T [] fred) { return fred.Length * sizeof(T); } 

コンパイルされません。

私の意図は、バイナリファイルに整数、バイトまたはダブルの配列を書き込むルーチンを書くことです。

ような何か//書く配列T []データ

void WriteToFile<T> (Filestream f, T[] data) 
{ 
    int bufferSize = data.Length * sizeof(T); 
    byte[] workBuffer = new byte[bufferSize]; 
    System.Buffer.BlockCopy(data, 0, workBuffer, 0, bufferSize); 
    f.Write(workBuffer, 0, bufferSize); 
} 

適応するのは簡単だろうけれども、それは場合にのみはsizeof(また、2Dアレイのために働くなるように(これをテンプレートにどのような方法がありますT)が働いていた

+0

私たちの改善点をあなたの質問にロールバックしないでください。 – FelixSFD

答えて

1

あなたが得るエラーは、これは次のとおりです。そのためのsizeofだけSystem.Runtime.InteropServicesを使用することを検討してください(危険な状況で使用することができ、

「T」定義済みのサイズを持っていません。 Marshal.SizeOf)

documentation on the sizeof operatorで説明本:構造体を含む全ての他のタイプについて

は、sizeof演算子は、安全でないコードブロックに使用することができます。 Marshal.SizeOfメソッドを使用することはできますが、このメソッドによって返される値は、sizeofによって返される値と必ずしも同じではありません。 Marshal.SizeOfは、型がマーシャリングされた後のサイズを返しますが、sizeofは、パディングを含む共通言語ランタイムによって割り当てられたサイズを返します。

しかし、あなたはまた、cannot use sizeof with any managed type:危険なキーワードと一緒に使用しても

、管理対象オブジェクトのアドレスを取って管理対象オブジェクトのサイズを取得、またはマネージ型へのポインタを宣言しています禁じられている。管理タイプは次のとおりです。

  1. 任意の参照型

  2. Marshal.SizeOfを使用する

あなたの唯一のオプションがあるフィールドまたはプロパティとして参照型を含む任意の構造体。

+0

私はsizeofで安全ではなかったがコンパイルしない。 –

+0

エラーが発生すると、/ unsafeパラメータを使用してコンパイルする必要があることがわかります。https://msdn.microsoft.com/en-us/library/ct597kb0.aspx –

+0

安全でないコードが有効になっています。あなた自身を試してみてください。 –

関連する問題