4

それで、私は初めて Linq to XML に飛び込んできました (私は知っていますが、私は時間に遅れをとっています)。ただし、この非常に紛らわしい動作に遭遇しました。

一般的な形式を解析してい.resxます。その中に、とオプションのを持つdataタグがあります。最初に試したコードは次のとおりです。valuecomment

        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
            };

もちろん、要素の を取得する場所で.valuecomment、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ですか?

4

2 に答える 2