重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

 こんにちは。毎度皆さんにお世話になっているc#初心者です。

 c#にも暗黙/明示的型変換を定義することが出来ますよね? それで、どこまでのものが暗黙の型変換として許容されるかということが疑問になり質問させていただきました。毎度のことですがライブラリ内のクラス・構造体についてです。

 例えば、あんまり意味はありませんが、百分率を表す構造体

public struct Percentage
{
  private int _percentage;
}

 があり、その内部で

public static implicit operator Percentage(int value)
{ return new Percentage(value); }

 程度なら十分許される範囲だと思います(間違っていたらご指摘ください)。

 ですが、例えば、「System.Drawing.Color」構造体と同じものを作ったとして、本来「FromName」メソッドで処理するのが妥当と思われる「string」から「Color」への変換を

puclic static explicit operator Color(string name)
{ return FromName(name); }

 のようにしてしまうのはまずいのでしょうか? 多分まずいですよね。だとすると、どの程度の変換がボーダーラインなのか(出来れば具体例もあれば助かります)知りたいのですが、どなたか詳しい方はいらっしゃいませんか?

A 回答 (2件)

私の判断はどちらも不可。



まず,基本的なところ。
MSDN: 変換演算子
http://msdn.micosoft.com/ja-jp/library/ms229033. …

後者の例について,
> 型のドメインの外部で変換演算子を定義しないでください。
に反する以上,変換演算子を「定義すべきではない」となる。

次に,前者について,本質的に百分率の値である以上,10%は0.10mと等しいはず。
さらに,intをPercentageに変換したい場合,値を保持するのか,表現を保持する(=1/100の値を保持する) のか,両方の要求が存在する。
故に,intからPercentageへの変換は明示的な名前のついたメソッドで行うべき。
# decimalへのimplicit castは必要であればあってもよい。

この回答への補足

 毎度毎度、回答・ご指摘ありがとうございます。

> 私の判断はどちらも不可。
 そうですね。よく考えればこの前読みました。もう少しいい例を考えるべきでした。


 ただ、少し、補足させてください。

> 本質的に百分率の値である以上,10%は0.10
> intをPercentageに変換したい場合,値を保持するのか,表現を保持する(=1/100の値を保持する) のか

 百分率の値ではなく、百分率そのものです。前記の型変換がよいかどうかはともかく、百分率が整数であるとしたのは「System.ComponentModel.ProgressChangedEventArgs」の「ProgressPercentage」を見てください。整数型になっているはずです。

 また、辞書によると

「全体を100としたとき、そのうちのいくらにあたるかということ。単位はパーセント。」

 です。と言うわけで、百分率=整数と判断しました(上記の型変換がよいかどうかは別として)(間違いがあればご指摘ください)。


 それともう一つ、本題のボーダーラインって分かりませんか? 曖昧かつ初歩的なな質問で苦労されるかと思いますが…。

補足日時:2012/03/26 00:21
    • good
    • 0
この回答へのお礼

 回答ありがとうございました。

 よく考えてみれば、今、ボーダーラインを曖昧に知っておくよりは、今後、個別にOKかNGかの質問をするほうが理にかなっているようです。

 今回はこんな初心者に付き合ってくださってありがとうございました。

お礼日時:2012/03/26 23:40

1点だけ: 百分率は (パーセントを単位としても) 整数とは限りません. そして, System.ComponentModel.P

rogressChangedEventArgs において整数としているのは「そのように設計した」以上の意味を持ちません.
    • good
    • 0
この回答へのお礼

 回答ありがとうございます。

 そういうことだったんですね。以後気をつけます。

お礼日時:2012/03/26 23:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!