暗黙の演算子が存在していても、オブジェクト型とオブジェクト型の比較ではなく、等価比較のためにC#で暗黙的にオブジェクトをint型に変換できるのはなぜですか?なぜ等価チェックは、オブジェクト型の暗黙的な変換を許可しませんが、intのですか?
bool errorHere = valueOnly == valuePair;
行が例外を示しています。ここで
class Program
{
static void Main(string[] args)
{
ValueOnly valueOnly = new ValueOnly();
ValuePair valuePair = new ValuePair();
bool areEqual = valueOnly.Value == valuePair;
bool errorHere = valueOnly == valuePair;
bool butNotHere = valueOnly == (ValueOnly)valuePair;
valueOnly = valuePair; // Or Here
}
}
public class ValuePair
{
public int Value { get; set; }
public string Text { get; set; }
public static implicit operator ValueOnly(ValuePair valuePair) {
if (valuePair.Text != null || valuePair.Value != 0) {
return new ValueOnly() { Value = valuePair.Value };
}
return null;
}
public static implicit operator int(ValuePair valuePair) {
return valuePair.Value;
}
}
public class ValueOnly
{
public int Value { get; set; }
}
は誤りです:
Error Operator '==' cannot be applied to operands of type 'ValueOnly' and 'ValuePair'
私はそれが間違っていると言っているかもしれませんが、もしそうなら、なぜこれが機能しますか? "bool areEqual = valueOnly.Value == valuePair;" valueOnlyのValueプロパティはintで、valuePairは暗黙的にint型に変換されます。 – Daryl
参照している行は、明示的な変換を実行しており、定義済みの暗黙の演算子を使用しています。本当の質問は、どうして明示的に変換を定義する必要があるのでしょうか? – Daryl
@ダリル:あなたの質問をもう一度読んだ後で改訂しました。二つの型は無関係であるため、 'ValuePair'から' ValueOnly'への変換を明示的に定義しなければなりません。 – Jon