2

私は奇妙な問題を抱えており、何が原因なのか疑問に思っていました。

次の XML があります。

<categories>
  <category Name="Generic" Id="0"></category>
  <category Name="Development Applications" Id="2"></category>
  <category Name="Standard Templates" Id="5"></category>      
  <category Name="Testing" Id="9" />
</categories>

および「カテゴリ」のリストを作成する次のコード:

var doc = XDocument.Load("categories.xml");

var xElement = doc.Element("categories");
if (xElement == null) return;

var categories = xElement.Elements().Select(MapCategory).ToList();

どこ:

private static Category MapCategory(XElement element)
{
    var xAttribute = element.Attribute("Name");
    var attribute = element.Attribute("Id");
    return attribute != null && xAttribute != null 
        ? new Category(xAttribute.Value, attribute.Value) 
        : null;
}

コンパイルする前に、これが間違っているというエラー/警告などはありませんが、コンパイルすると次のメッセージが表示されますが、赤い下線はまだありません:

メソッド 'System.Linq.Enumerable.Select<TSource,TResult>(System.Collections.Generic.IEnumerable, System.Func<TSource,TResult>)' の型引数は、使用法から推測できません。型引数を明示的に指定してみてください。

問題の行を次のように変更すると、すべて問題ありません。

var categories = xElement.Elements().Select<XElement, Category>(MapCategory).ToList();

Select<XElement, Category>私はそれが冗長だと思っていただろうか?ReSharper も私に同意します。

念のため、MapCategory を削除して次のものに置き換えましたが、今回は赤い下線とコンパイル エラーが表示されます。

var categories2 = doc.Element("categories").Elements().Select(element =>
            { new Category(element.Attribute("Name").Value, element.Attribute("Id").Value); }).ToList();

私の混乱に加えて、別の開発者にもコードを試してもらいましたが、コンパイル エラーはまったく発生しませんでした。

なぜこれが起こっているのでしょうか?

4

1 に答える 1

3

私の混乱に加えて、別の開発者にもコードを試してもらいましたが、コンパイル エラーはまったく発生しませんでした。

同僚とは異なるバージョンの C# コンパイラを使用していると思います。

これは、LINQ to XML やElements()呼び出しの使用に限定されません。次の場合、同じ動作が見られると確信しています。

private static string ConvertToString(int x) { ... }

...
IEnumerable<int> values = null; // We're only testing the compiler here...
IEnumerable<string> strings = values.Select(ConvertToString);

基本的に、メソッド グループ変換を使用したジェネリック メソッド呼び出しの型推論は、C# 4 コンパイラで改善されました。(C# 5 コンパイラでも改善されたと思いますが、はっきりとは思い出せません。) 型引数を明示的に指定する代わりに、ラムダ式を使用することもできます。

...Elements().Select(x => MapCategory(x))...
于 2012-09-11T00:48:23.170 に答える