DOBON.NET DOBON.NETプログラミング掲示板過去ログ

.netVBでのenumの項目におけるObsolete属性の動作

環境/言語:[WindowsXP、VB.NETおよびC#、.NET Framework3.5、VisualStudio2008]
分類:[.NET]

.net VB で以下のコードを作成するとなぜか Obsolete 属性をつけた
次の行で警告が発生します。解決方法を教えてください。

再現方法は新しいプロジェクトを作成し、下記のコードを打ち込みます。

Public Class Form1
Protected Enum TestEnum
None = 0
Allow
<Obsolete()> _
DontUse
EnumContents3
End Enum
End Class

EnumContents3 の行で
「warning BC40008: 'DontUse' は旧形式です。」の警告が発生します。
なぜ、このような警告が発生してしまうのかがわかりません。

また、C# で同様なことをすると警告が発生しません。
public partial class Form1 : Form
{
protected enum TestEnum
{
None = 0,
Allow,
[Obsolete()]
DontUse,
EnumContents3
}
}
■No27402に返信(ありげ〜さんの記事)
> .net VB で以下のコードを作成するとなぜか Obsolete 属性をつけた
> 次の行で警告が発生します。解決方法を教えてください。
>
解決したい内容はなんでしょうか?
この記述で思った動きにならないのは現在のvb.netの作りによるものなのでどうにもならないでしょう。
おそらく、EnumContents3 = DontUse + 1 と解釈されるからではないでしょうか。
どうしても回避したいのであれば、以下のように記載するとかでしょうか。

None = 0
Allow
<Obsolete()> _
DontUse
EnumContents3 = 3

または 3 の代わりに、Allow + 2 とかかなぁ。。。
■No27402に返信(ありげ〜さんの記事)
> 解決方法を教えてください。

「None = 0」を「None '= 0」に変更してみてください。
つまり、Enum 中で値指定を一切行わないという事です。

もしくは逆に、全ての値に値を明示指定するかです。たとえば
値が特別な意味を持つ場合(特に、Flags属性付きの場合など)においては
それぞれに値を明示した方が良いでしょうね。


個人的には、このようなケースにおいて、列挙値に Obsolete を付与することは
避けるべきかと思います。

Obsolte は、将来その値が廃止されることを示唆しているわけですが、
宣言時に値を明示していない列挙値の場合、途中のメンバーが抜けてしまえば、
その分、次の値(EnumContents3)がずれてしまうわけですしね。
魔界の仮面弁士様
すべての enum に値を設定しない、もしく設定すればよかったのですね。

今回の場合では enum の項目を削除することは考えていませんでしたが、
値がずれることは重要な問題だと思います。

貴重なご意見ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板