式ツリーには、オプションの引数を使用する呼び出しまたは呼び出しを含めることはできません


145

式ツリーには、オプションの引数を使用する呼び出しまたは呼び出しを含めることはできません

return this.RedirectToAction<MerchantController>(x => x.Edit(merchantId));

編集に2番目のNULL可能引数があった場合。

どうしてこれなの?

回答:


106

基本的な式ツリーAPIは、オプションの引数をサポートしていません。

ILでコンパイルされたコードの場合、C#コンパイラはコンパイル時にデフォルト値を挿入します(ハードコード)。これは、引数が明示的に指定されていない場合でも、CLRはオプションの引数を持つメソッドの呼び出しをサポートしないためです。


2
これにはどういうわけかオーバーロードが含まれていますか?過負荷をかけたときに私はこれを得ていました。void Blah(string a)やvoid Blah(object a)のようなもの。オブジェクトを含むバージョンへの呼び出しをMOQしようとしたときに、このエラーが発生しました。
vbullinger 2013年

4
特定のオーバーロードがツリーにハードコードされるという意味で、オーバーロードは完全にサポートされています。
usr

1
かなり不可解なエラーメッセージですが、この回答は方法を示したもので、メソッドに省略値のパラメーターがあり、モックしようとしているメソッドにデフォルト値がありました。
vpalmu 2016年

139

Mock.setupを使用して複数のデフォルトパラメータを持つメソッドをモックしようとすると、同じメッセージが表示されました。ラムダにパラメーターを追加する必要がありました。

void someMethod(string arg1 = "", string arg2 = "")

mockedObject.Setup(x => x.someMethod(It.IsAny<string>(), It.IsAny<string>()))

1
これは私を助けました。欠けていましたIt.IsAny<object>。基本的に、次のパラメータがありませんでしたsomeMethod()
akasoggybunz 2018

また、メソッドのすべてのパラメーターに値が含まれていることを確認する必要がありました(メソッドのシグネチャにはいくつかのパラメーターがあり、デフォルト値が設定されています)。
slashNburn

1
ユースケースにもよりますがx.someMethod(default,default)…...使用できます。
LosManos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.