gpt4 book ai didi

c# - 为什么这里需要 "this"(扩展方法)?

转载 作者:太空狗 更新时间:2023-10-30 01:25:46 27 4
gpt4 key购买 nike

元注释:无法搜索单词“this”。

我刚刚在 ASP.NET 中遇到了一个奇怪的场景,其中 this关键字是必需的。但这并不是为了在局部变量和实例变量之间进行解析,正如您在构造函数中看到的那样。

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. 为什么编译器不能发现我正在寻找采用表达式的重载并使用它?因为该方法接受一个 Action 的表达式,而不仅仅是一个必须涉及的 Action 。我完全不了解Expressions命名空间,所以我不知道使用这种参数类型的目的。

  2. 不管 #1 的答案如何,为什么只是添加 this解决所有问题?

最佳答案

扩展方法以这种方式工作。

根据 C# 规范(7.6.5.2 扩展方法调用),仅当调用具有“一种形式”时才使用扩展方法:

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

这基本上意味着你总是必须在“.”的左边有一些东西。让编译器解析扩展方法。 expr. 部分必须存在(并且不是动态的)以便编译器查找扩展方法。

例如,这里有一个小测试来演示:

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();
}
}
}

请注意编译器错误 - 因为我们在测试实例中,您不能在不使用 this. 的情况下直接调用 Print()。但是,我们可以轻松地执行 test.Print()(或 this.Print() inside Test)。

关于c# - 为什么这里需要 "this"(扩展方法)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6284817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com