- PR -

C#2.0で暗黙の変換を禁止したい。

1
投稿者投稿内容
はたけ
常連さん
会議室デビュー日: 2006/02/08
投稿数: 27
投稿日時: 2009-02-20 16:51
お世話になります、暗黙の変換を禁止させたいのですが、
C#で暗黙の変換の禁止は可能なのでしょうか?

public partial class Form1 : Form
{
public enum hoge
{
aa = 0,
bb = 1,
cc = 2
}

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
hoge aaa = hoge.aa;

if (aaa == 0)
{
MessageBox.Show("333");
}
}
}

上記プログラムで、 (aaa == 0)の部分なのですが、
これでコンパイルが通ると、列挙体を使う意味が半減され、非常に困っています。
VB.netには禁止するスイッチがあるみたいですが。。。
しばらくwebサイトをさまよいましたが、分かりませんでした。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-20 17:24
拡大変換は無条件で通ります。
http://msdn.microsoft.com/ja-jp/library/k1e94s7e.aspx

> VB.netには禁止するスイッチがあるみたいですが。。。

どのスイッチでしょうか?
はたけ
常連さん
会議室デビュー日: 2006/02/08
投稿数: 27
投稿日時: 2009-02-20 17:27
Option Strict =[ON | OFF]
です。

もしかして、列挙体の暗黙の変換には使えないのでしょうか?
C#ではないので、試していないのですが。。。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-20 17:34
すみません。
リンク先見ましたか?

Option Strict =[ON | OFF]
で制御しようと拡大変換は通ります。
縮小変換は通りません。
はたけ
常連さん
会議室デビュー日: 2006/02/08
投稿数: 27
投稿日時: 2009-02-20 17:41
改めて確認しました。
おっしゃられているよう拡大変換ではダメみたいですね。

しか、比較の部分を以下のように、
0以外にするとコンパイルでエラーになってくれるのが、
なんか解せないのですが。。。。

if (aaa == 2)
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2009-02-20 17:52
列挙型の変数をコンストラクタで初期化すると規定で 0 で初期化されますので、0 は必要なんじゃないですかね?

コード:

public enum Hoge
{
aa = 0,
bb = 1,
cc = 2
}

public enum Fuga
{
aa = 1,
bb = 2,
cc = 3
}

static void Main()
{
Hoge aaa = new Hoge(); // 0 (すなわち Hoge.aa) で初期化される
Fuga bbb = new Fuga(); // 0 で初期化される
}



あと、↓こういうことをしたい場合もあるし。

コード:

[Flags]
public enum RGB
{
B = 1,
R = 2,
G = 4
}

static void Main()
{
RGB rgb;

// ...

if ((rgb & RGB.R) == 0)
{
// ...
}
}



[ メッセージ編集済み 編集者: rain 編集日時 2009-02-20 17:58 ]
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-20 17:57
暗黙の拡大変換が解せないとなると

this.Controls.Add(this.button1);
double d = 1;
string s = string.Format("{0}", "aaa");

などが全て解せない事になりますが・・・。
はたけ
常連さん
会議室デビュー日: 2006/02/08
投稿数: 27
投稿日時: 2009-02-20 18:18
rain様。
初期化の件了解しました。
仕様だとしょうがないですね。
使い方はなるほどですが、仕様としては個人的にはすっきりしないですが。。。
(enumに0を登録しないと、初期化状態の検査が面倒なくらいの方が個人的には好みですが。)

King様。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)