2011-10-11 13 views
33

私は非常に単純な問題があります。 私はあなたのために私の問題を実証するための非常に単純な機能を作りました。割り当てられていないパラメータの使用、C#

//メイン//

static void Main(string[] args)  
{ 
double[,] mydouble = new double[1, 4]; 
mynewMatrix(out mydouble);// call of method 
} 
public static void mynewMatrix(out double[,] d) 
{ 
    for (int i = 0; i < 4; i++) 
    { 
    d[0,i]=i; 
    } 
} 

//エラー

未割り当てのうちのパラメータ 'newMAt' outパラメータの

使用 'newMAt' コントロールが現在のメソッドを離れる前に割り当てる必要があります

どこに問題があるのか​​わかりません。エラーメッセージは明確である

+5

エラーメッセージは非常に明示的です。あなたが理解していないことを正確に記述してください。 –

+3

'newMAt'パラメータは表示されません。 – BoltClock

答えて

70

:ちょうどこれを書いてください。 outは、パラメータが関数内で初期化されてから返されることを意味します。使用のいくつかの例:

static void Main(string[] args) 
{ 
    double[,] mydouble; 
    mynewMatrix(out mydouble);// call of method 

    double[,] mydouble2 = new double[1, 4]; 
    mynewMatrix2(mydouble2);// call of method 

    // useless for what you want to do 
    mynewMatrix3(ref mydouble2);// call of method 
} 

public static void mynewMatrix(out double[,] d) 
{ 
    d = new double[1, 4]; 

    for (int i = 0; i < 4; i++) 
    { 
     d[0, i] = i; 
    } 
} 

public static void mynewMatrix2(double[,] d) 
{ 
    for (int i = 0; i < 4; i++) 
    { 
     d[0, i] = i; 
    } 
} 

// useless for what you want to do 
public static void mynewMatrix3(ref double[,] d) 
{ 
    for (int i = 0; i < 4; i++) 
    { 
     d[0, i] = i; 
    } 
} 

私はあなたがrefoutとの違いは何かわからない場合、あなたはあなたの配列パラメータの要素に値を代入しているDifference between ref and out parameters in .NET

4

- あなたはあなたのメソッド内で自分のアウトパラメータに値を割り当てる必要があります:あなたはメソッド外で行わ

public static void mynewMatrix(out double[,] d) 
{ 
    d = new double[1, 4]; 
    for (int i = 0; i < 4; i++) 
    { 
     d[0,i]=i; 
    } 
} 

割り当ては効果がありません。配列を外部関数の定義されている場合、あなたは(配列が参照型で考えると、または何も)refを使用する必要があります

static void Main(string[] args)  
{ 
    double[,] mydouble; 
    mynewMatrix(out mydouble); 
} 
+5

戻り値の前ではなく、メソッド内の 'd 'からの* read *の前です。 –

1

を読むことができることを追加しますC#で

d = new double[1, 4]; 
13

は、2つの非常に類似したキーワード、refとあります。そのoutとして定義されているため、いますが、配列自体にyの値を割り当てる必要があります。

それらの両方が参照によって値を渡す、その差は次のとおりです。

あなたがrefを使用する場合、コンパイラは、従来の方法を呼び出すには、あなたの変数を割り当てることができが必要になります。

outを使用する場合、これは必要ありません。つまり、パラメータがすでに設定されていると想定することはできません。メソッド内でその値を読み取ることはできません。

 

ちょうど他の誰かがあなたのメソッドを呼び出すために、このコードを書いた場合に何が起こるか想像し、問題を説明するために:

double[,] myUnassignedDouble; 
mynewMatrix(out myUnassignedDouble); 

は明らかに変数は悪いである、割り当てられたことはありません。

 

これは3つのオプションであなたを残します:

  1. が割り当て変数、メソッドを呼び出すと、あなたのメソッド内で、一度割り当て変数をvoid mynewMatrix(ref double[,] d)
  2. を使用し、使用するたびvoid mynewMatrix(out double[,] d)
  3. メソッドを呼び出して使用するたびに変数を割り当てるvoid mynewMatrix(double[,] d)

3つ目のオプションは、今まで変数を再割り当てする必要がないためです。明らかに、あなたのコードが複雑になるにつれて、それが変わるかもしれません。最初にoutを使用する理由があったと思いますか?

関連する問題