2011-07-31 37 views
4

バイナリ演算子を宣言するとき、少なくとも1つの演算子型が包含型でなければなりません。これは一般的に良い設計の決定と言えます。しかし、次のコードでこのエラーが発生するとは思わなかった:ジェネリックと "バイナリ演算子のパラメータの1つは、格納する型でなければなりません"エラー

public class Exp<T> 
{ 
    public static Exp<int> operator +(Exp<int> first, Exp<int> second) 
    { 
     return null; 
    } 
} 

この演算子の問題点は何ですか?なぜこのケースがC#の演算子オーバーロード制限に該当するのですか?この種の宣言を許可するのは危険ですか?

答えて

5

含有タイプがExp<T>であるため、Exp<int>ではありません。あなたがここでやろうとしているのは、特殊化la C++です。これはC#では不可能です。

+0

ここで問題となるのは、オペランドが型を含むことに関連していないということではありません。危険である可能性がありますが、「特殊化」は許されません。 – nakhli

+0

はい。あなたがしようとしているのは、C#で直接可能でないC++ *テンプレートの特殊化*のように見えます。 [this](http://stackoverflow.com/questions/600978/how-to-do-template-specialization-in-c)を見てください。 –

3

あなたはタイプExp<T>のクラスに属しており、オペレーターのパラメーターのいずれもExp<T>ではありません。それらはどちらもExp<int>です。

this articleを参考にしてください。

+0

私は種類が異なることを知っています。彼らが関係していない場合、私はそれが危険なことができると理解しています。しかし、ここでは、ジェネリック医薬品によって課せられた制限のほうが、デザインセーフガードよりも似ています。 提案された記事をありがとうございました! – nakhli

関連する問題