2017-08-21 2 views
1

Main()の最後の行では、ポインタの処理をしようとしたときにエラーが発生しますが、実際にやっているのはFooクラス内で定義した乗算演算子です。それが乗算を呼び出すための構文ではない場合、それは何ですか?逆参照*対乗法*あいまいさ

namespace test 
{ 
    class Program 
    { 
     class Foo 
     { 
      int foo; 
      public Foo(int n) 
      { 
       foo = n; 
      } 
      public static object operator *(Foo a,Foo b) 
      { 
       return new Foo(a.foo * b.foo); 
      } 
     } 
     static void Main(string[] args) 
     { 
      Foo a = new Foo(2); 
      Foo b = new Foo(3); 
      a * b; 
     } 
    } 
} 

私はそれが何かばかだと確信していますが、私はそれを見ません。

+5

あなたは何かに乗算の結果を割り当てる必要があります。あなたは 'a * b'だけを置くことはできません。これは同じエラーを返します: 'int x = 1; int y = 2; x * y; ' –

+1

おそらく演算子の結果を代入しますか? var result = a * b; – Diado

+5

無関係ですが、おそらく 'operator *'が 'object'ではなく' Foo'を返すようにしてください。そうすれば、 'a * b * c'も動作します(' object'と 'Foo'の演算子を持たないというエラーを出すのではなく)。 –

答えて

3

C#では、ステートメントとして使用できる唯一の式(例:

  • 割り当て:あなたが評価し、単に評価の結果を無視することができます式は)あるa = b;
    • 最も明白な有効な文が、それでも代入式は意味し、結果値を持っていますあなたはif ((a = b) == c) doStuff();のようなワンライナーを書くことができます - プレーン割り当て
  • をするとき、あなたはまだ代入式の結果を「使用しない」されているので、この方法は、を呼び出します。doStuff();
    • doStuffが値を返す場合でも、あなたはどこにでもstringを保存せずにa.ToString();を呼び出す場合、コンパイラは
  • 増分を文句を言わないだろう声明
  • として使用することができますi--;
    • ポスト/プレインクリメント結果S i++;、:/デクリメントemanticsは方法に待っている
    • あなたは(var x = i++;のように)結果を使用している場合、それは問題ではありません、すべてのCのような言語でほとんど同じであるかない
    await doAsyncStuff();
    • あなたは結果を消費することなく、非同期動作を待つことができる(これは普通、メソッド呼び出しと基本的に類似している)
  • newオブジェクト式:0
    • 新しくインスタンス化されたオブジェクトを何かに割り当てなくても、そのコンストラクタはプログラムの状態に影響を与えたり、静的な参照を自分自身に作成することがあります(そうでなければ、

      static void Main(string[] args) 
      { 
          Foo a = new Foo(2); 
          Foo b = new Foo(3); 
      
          // this is seen by the compiler as "type* variable;" 
          a * b; 
      } 
      

だから、この操作の結果を消費していないので、(変数に代入)、C#コンパイラを使用すると、タイプa*の変数bを定義しようとしていると仮定しそれはのように、あなたにいくつかのコンパイルエラーを与える理由

これは、次のとおりです。

  • aは、変数であるが、
  • ポインタが唯一の危険なコンテキストで許可されているタイプとして使用されている

+演算子を使用した場合は、ポインタを一切言及していないので、式を文として使用するはずがないと不平を言うだけで、より明白になるはずです。

変数に式の結果を割り当てて、エラーを解決するには:サイドノートとして

// type of `result` is an object, btw 
var result = a * b; 

を、あなたのoperator *方法ではなく、プレーンの、タイプFooの結果を返すことを賢明だろうobject

public static Foo operator *(Foo a, Foo b) 
{ 
    ... 
} 

// type of `result` is now `Foo`, as it should be 
Foo result = a * b; 

最終提案は、この具体例では、代わりに、不変structための良好な候補であることであろうclasssimilar to the Point struct, for example)。

+0

@ m.rogalski:はい、私はちょうどそれをタイプしていました、私は後で 'オブジェクト'戻り型を実現しました。 – Groo

+2

私はFooの代わりにオブジェクトを返すという事実を見落とすことが私の全面的な問題だった。しかし、残りの部分は参考にするのが良いです。 –