2011-06-22 9 views
2

整数値を持つクラスobjectの2つ以上の変数があります。私は '+'演算子をオーバーロードして、これらの変数を加算または減算したいときにこれらの変数を変換する必要がないようにします。ここに私のコードは以下の通りです:オブジェクトクラスのオペレータ '+'をオーバーロードできません

public static object operator +(object obj1, object obj2) 
{ 
    object o = Convert.toint32(obj1) + Convert.toint32(obj2); 
    return o; 
} 

問題ありませんが、私は"One of the parameters of a binary operator must be the containing type"

は、なぜこの出来事であるというエラーを取得していますか?どんな助けもありがとう!

+2

40秒で5つの答えが - それはSOレコードですか? –

+0

オーバーロード演算子をパラメータのいずれかと同じクラスに移動します。あなたの場合、オーバーロード全体がオブジェクトクラスにある必要があります。 –

答えて

7

正確にはです。カスタムバイナリ演算子を作成する場合、(オペランドの)少なくとも1つのパラメータ型が、使用している型と同じでなければなりません演算子を宣言しています(または値型の場合はnull値を取ることができます)。

これはC# 4 specificationのセクション10.10.2に義務付けられている:

The following rules apply to binary operator declarations, where T denotes the instance type of the class or struct that contains the operator declaration:

  • A binary non-shift operator must take two parameters, at least one of which must have type T or T?, and can return any type.
  • A binary << or >> operator must take two parameters, the first of which must have type T or T? and the second of which must have type int or int?, and can return any type.

個人的に私は、あなたは彼らが実際にint値なら知っていればタイプobjectの変数を持つ避けるようにしようとするだろう。代わりにint変数を持っていないのはなぜですか?

C#4を使用している場合は、変数をdynamicにすることもできます。オペレータのオーバーロードはコンパイル時ではなく実行時に適用されます。

+0

実際に私はObject型の複数のオブジェクトを追加することについてここでの質問を見たので、私は+演算子をオーバーライドできると思っていましたが、私はそれが不可能であることを知りませんでした。 –

3

既存のクラスの演算子をオーバーライドすることはできません。独自のクラスのみをオーバーライドすることはできません。

+3

*演算子をオーバーライドすることはできません。 –

+1

ええ、私はもちろん、それを知っていた。誰もが目を覚ましていたことを確認するだけでした –

1

オペレータをクラス内で定義しています。たとえば、class Fooとしましょう。それはあなたがここで達成しようとしているものを非常に明確ではありません

public static object operator +(Foo obj1, object obj2) 
{ 
    object o = Convert.toint32(obj1) + Convert.toint32(obj2); 
    return o; 
} 

:コンパイラは、二つのオペランドの少なくとも一方は、例えばFooの静的な型を持っていなければならないことを示しています。 class Fooのオブジェクトがあり、静的タイプがobjectの場合は、最初にFooにキャストしない限り、何も実行できません。

2

objectという2つのオブジェクトを追加したいと言っているのですが、そうすることはできません。

エラーメッセージには、演算子メソッドの2つのパラメータの1つが、演算子を定義した型である必要があります。

ie。 XYZという名前のクラスの中で演算子を宣言した場合は、obj1またはobj2のいずれかがその型である必要があります。

無関係型の演算子オーバーロードを宣言することはできません。

基本的には、やりたいことはできません。

2

コンパイラエラーは、問題を正確に伝えています。

演算子のオーバーロードを他の型に「挿入」することはできません。演算子のオーバーロードは、宣言する型に適用する必要があります。

この場合、「適用」という用語は、コンパイラエラーによって説明されます。パラメータの1つは、そのタイプでなければなりません。他のパラメータは任意のタイプでよい。

ので、例えば:

public class MyType 
{ 
    public static object operator +(MyType obj1, object obj2){ 
    //define code for adding the object to 'MyType' and return object, 
    //or whatever type you want. 
    } 
} 

この例では、MyTypeobject間のオペレータを作成しているし、それがMyType内で定義されていますので、それが動作します。バイナリ演算子のオーバーロードはすべて同じ規則に従う必要があります。

3

これは愚か/ばかげているようだ、オブジェクトがint秒であり、あなたがキャストしたくないので、あなたは(クレイジーらしい)object秒を追加することで、コードが読みにくくしますよね? myObj + 1をしたいときはどうなりますか?あなたは大量の演算子と過負荷を作る必要があり、その努力に値するものではありません。

将来的にコードを読んだり維持したりする必要がある場合は、最初に正しいタイプを使用してください。

関連する問題