10

次の高階関数があります。

public static Func<T, bool> Not<T>(Func<T, bool> otherFunc)
{
    return arg => !otherFunc(arg);
}

そして、それをそのように呼び出そうとしています:

var isValidStr = LinqUtils.Not(string.IsNullOrWhiteSpace);

コンパイラで「型引数は使用法から推測できません」というエラーが表示されます。しかし、次の作品:

var isValidStr = LinqUtils.Not((string s) => string.IsNullOrWhiteSpace(s));

違いは何ですか? string.IsNullOrWhiteSpaceはすでにまったく同じシグネチャを持つオーバーロードされていない関数です。

コメントで述べたように、以下も機能しますが、この場合に型推論が失敗する理由はまだ説明されていません。

var isValidStr = LinqUtils.Not<string>(string.IsNullOrWhiteSpace);
4

2 に答える 2

6

あなたが扱っている問題の詳細は、Eric Lippert のブログで回答されています

基本的に、「David B」があなたのコメントで言ったように、「IsNullOrWhiteSpace はメソッド グループです。メソッド グループには現在 1 つのメンバーしか参加していませんが、将来はさらに増える可能性があります。」

于 2012-06-12T17:37:59.087 に答える
2

これは機能します:

var isValidStr = Not<string>(string.IsNullOrWhiteSpace);

ただし、コンパイラはここで型パラメーターを推測するのに十分な情報を持っている必要があるようです-これは必須ではありません...

于 2012-06-12T17:26:35.570 に答える