それで、私は初めて Linq to XML に飛び込んできました (私は知っていますが、私は時間に遅れをとっています)。ただし、この非常に紛らわしい動作に遭遇しました。
一般的な形式を解析してい.resx
ます。その中に、とオプションのを持つdata
タグがあります。最初に試したコードは次のとおりです。value
comment
var items = from str in doc.Root.Descendants("data")
select new ResourceValue
{
Name = str.Attribute("name").Value,
Value = str.Element("value").Value,
Comment=str.Element("comment").Value
};
もちろん、要素の を取得する場所で.value
はcomment
、null 参照例外がスローされます..では、もう一度試してみましょう。XElement を文字列にキャストすると、魔法のように機能すると聞きました。それを試してみましょう
var items = from str in doc.Root.Descendants("data")
select new ResourceValue
{
Name = str.Attribute("name").Value,
Value = str.Element("value").Value,
Comment=str.Element("comment") as string
};
うーん。今度はコンパイルエラーが発生します。
参照変換、ボックス化変換、ボックス化解除変換、ラッピング変換、または null 型変換を介して、型 'System.Xml.Linq.XElement' を 'string' に変換できません
うーん、それは奇妙です..stackoverflowを検索してみましょう。見よ、代わりにこれを示唆するスニペットを見つけた:
var items = from str in doc.Root.Descendants("data")
select new ResourceValue
{
Name = str.Attribute("name").Value,
Value = str.Element("value").Value,
Comment=(string)str.Element("comment")
};
うわあ。効く!? しかし、文字列にキャストnull
すると null 参照の例外がスローされます...そうではありませんか? まさにこのas string
シチュエーション!?
これはどのように機能し、明示的なキャストを実行できるのに、明示的なキャストを実行できないのはなぜas
ですか?