4

メタノート:「this」という単語を検索することはできません。

thisキーワードが必要なASP.NETで奇妙なシナリオに遭遇しました。ただし、コンストラクターで見られるように、ローカル変数とインスタンス変数の間で解決することを目的としたものではありません。

Microsoft.Web.Mvcには、というクラスが含まれておりControllerExtensions、オーバーロードを使用していRedirectToAction(Expression<Action<TController>> action)ます。オーバーロードは拡張機能であるため、これは特別なことかもしれません。

RedirectToAction(c => c.Index())コンパイルされません、そしてそれは言いCannot convert lambda expression to type 'string' because it is not a delegate typeます。これは、文字列を受け取る最初のオーバーロードを使用していると思われるように聞こえます。

this.RedirectToAction(c => c.Index())正常にコンパイルされます。this最初のパラメーターとして渡すことで、静的に呼び出すこともできます。

  1. 式を受け取るオーバーロードを探していることをコンパイラが理解できず、それを使用できないのはなぜですか?メソッドはアクションだけでなくアクションの表現をとるので、それが関与している必要があります。Expressions名前空間をまったく理解していないため、このパラメーター型を使用する目的がわかりません。

  2. #1の答えに関係なく、なぜ単に追加するだけでthisすべてが修正されるのでしょうか。

4

3 に答える 3

4

拡張メソッドはこのように機能します。

C#仕様(7.6.5.2 Extension method invocations)によると、拡張メソッドは、呼び出しに「フォームの1つ」がある場合にのみ使用されます。

expr . identifier ( )
expr . identifier ( args )
expr . identifier < typeargs > ( )
expr . identifier < typeargs > ( args )

これは基本的に、常に「。」の左側に何かが必要であることを意味します。コンパイラに拡張メソッドを解決させるため。コンパイラが拡張メソッドを探すには、そのexpr.部分が存在する必要があります(存在しない必要があります)。dynamic

たとえば、次のことを示す小さなテストがあります。

namespace TestNamespace
{
    using System;

    public static class TextExtension
    {
        public static void Print(this Test test)
        {
            Console.WriteLine("Found");
        }
    }

    public class Test
    {
        public void Foo()
        {
            // Compiler error!
            Print();

            // Works fine
            this.Print();
        }

        static void Main()
        {
            Test test = new Test();
            test.Foo();

            // Fine here
            test.Print();
            Console.ReadKey();
        }
    }
}

コンパイラエラーに注意してください。テストインスタンス内にいるため、をPrint()使用せずに直接呼び出すことはできませんthis.。ただし、簡単にtest.Print()(またはthis.Print()テスト内で)実行できます。

于 2011-06-08T20:44:08.793 に答える
0

#2に答えることができます。クラス(this)にはRedirectToActionメソッドが1つしかないため、あいまいさはありません。あなたが1つをオーバーロードした場合、あなたStringは再びそのエラーを受け取るだろうに違いない。

于 2011-06-08T20:29:25.480 に答える
0

あいまいさがあります。

'this'を使用すると、このメソッドが呼び出されます-

Controller.RedirectToAction

'this'がないと、extennsionメソッドを呼び出します-

Microsoft.Web.Mvc.ControllerExtensions.RedirectToAction
于 2011-06-08T20:33:47.467 に答える