VB.Net では、次のように XElement の最初の子要素のテキスト値を簡単に取得できます。
Dim sChildValue = xeParent.<MyChild>.Value()
もちろん、その構文は C# ではサポートされていませんが、Elements() メソッドと同じ IEnumerable(Of XElement) の結果が生成されます。したがって、上記を次のように書き換えることができます。
Dim sChildValue = xeParent.Elements("MyChild").Value()
この Value() 拡張メソッドは、小さな XML ドキュメントを扱うことが多く、一致する最初のノードだけが必要な場合に便利です。(このメソッドについて私を悩ませていることの 1 つは、指定された要素が見つからないために IEnumerable リストが空の場合、Nothing/null を返すように見えることです。これを回避するために、空を返す独自の ValueOrBlank() メソッドを作成しました。代わりにその状況でストリングを使用してください。)
私の問題は、C# で同じことができないことです。
var sChildValue = xeParent.Elements("MyChild").Value(); // won't compile, can't find Value() method
参照/インポートを確認したところ、同じ呼び出しが機能する VB.Net プロジェクトと一致しています。幸いなことに、カスタムの ValueOrBlank() 拡張メソッドを使用して同じことを実現できます。しかし、私の C# プロジェクトには何が欠けているのか知りたいです。Visual Studio で Value() メソッド呼び出しを右クリックし、[定義に移動] をクリックして、オブジェクト ブラウザーが拡張メソッドが保持されている場所を教えてくれるかどうかを確認してみましたが、System.String クラスしか表示されません。これは、XML Axis < MyChild > 構文のように、コンパイラ自体がサポートする卑劣な VB.Net 専用機能の 1 つということですか?