【问题标题】:Learning extension methods学习扩展方法
【发布时间】:2020-01-03 19:34:09
【问题描述】:

我正在学习扩展方法,我正在尝试编写我的第一个扩展方法。我想使用 System 命名空间并使用它编写一个扩展方法。

我的方法是将货币从 GBP 转换为 BGN。

在我的 Main 方法中,我现在只想使用这个扩展方法,但我得到一个编译错误。

public static class ExtentionMethodConvertGBPtoBGN
{
    public static double ConvertGBPtoBGN(this ExtentionMethodConvertGBPtoBGN obj, double BGNmoney, double conversionrate)
    {
        return BGNmoney * conversionrate;
    }
}

编译器抛出错误。

错误 CS0721 'ExtentionMethodConvertGBPtoBGN':静态类型不能用作参数

【问题讨论】:

  • 为什么是基本标签?
  • 好像你想要ConvertGBPtoBGN(this double BGNmoney, double conversionrate),所以你可以做someDoubleValue.ConvertGBPtoBGN(conversionrate);
  • @dedecos 使用扩展标签需要 1500 声望。我认为这是一个基本问题,因为我只是从这些开始。
  • @grozdeto 哦,我明白了。 “基本”是一种语言;该标签不适用于基本问题。

标签: c# extension-methods


【解决方案1】:

正确的做法是:

public static class ExtentionMethodConvertGBPtoBGN
{
    public static double ConvertGBPtoBGN(this double obj, double conversionrate)
    {
        return obj * conversionrate;
    }
}

this 之后需要使用要扩展的类型。在这种情况下,显然您想扩展 double 功能。并且您使用来自参数的obj(您以这种方式命名)。

【讨论】:

    【解决方案2】:

    this 之后的类型需要是您希望扩展方法存在的对象。

    所以如果你想让它在 double 上工作,它需要是

    public static double ConvertGBPtoBGN(this double obj, double BGNmoney, double conversionrate)
    

    【讨论】:

    • 更有可能是 BGNmoney 参数应该应用 this,因为 obj 甚至没有被使用。
    • @grozdeto 这不是扩展方法的工作方式,您不能向 Math 类添加新方法。
    • @grozdeto 您在 DLL 上没有扩展方法。您在 type 上有一个扩展方法——在本例中为 double 或更好的十进制,因为它是货币。您将键入15.99m.Convert... 并查看decimal 上的扩展方法,其名称以Convert 开头。静态扩展方法类的名称是 offstage。它可以是与其命名空间中的其他内容不冲突的任何内容。
    • @grozdeto .cs 文件将需要一个 'using` 用于定义扩展方法类的命名空间。Visual Studio“快速操作和重构”不会帮助您为扩展方法添加命名空间,很遗憾。
    • @EdPlunkett 谢谢。我刚刚创建了一个带有简单方法且没有构造函数的测试类。然后我使用了我的扩展方法并使用了这个 TestClass obj。然后在我的主要方法中,我在测试类上创建了一个实例,现在我可以看到附加方法。扩展方法太强大了。
    【解决方案3】:

    您可以通过以下两种方式进行操作: Lets,Conversion是主要的转换类:

    public class Conversion
    {
    
    }
    

    而且,ExtentionMethodConvertGBPtoBGN 是你的扩展类:

    public static class ExtentionMethodConvertGBPtoBGN
    {
       //extension mathod
        public static double ConvertGBPtoBGN(this Conversion obj, double BGNmoney, double conversionrate)
        {
            return BGNmoney * conversionrate;
        }
    
        //non-extension mathod
        public static double ConvertGBPtoBGN(double BGNmoney, double conversionrate)
        {
            return BGNmoney * conversionrate;
        }
    }
    

    现在你可以双向调用了:

    static void Main(string[] args)
        {
    
            var con = new Conversion();
            var result  = con.ConvertGBPtoBGN(10.0, 20.0);
    
            //or
            var result2 = ExtentionMethodConvertGBPtoBGN.ConvertGBPtoBGN(10.0, 20.0);
        }
    

    【讨论】:

    • 它不起作用,编译器出错。无法通过实例引用访问;用类型名称来限定它,这是因为如果非扩展方法是静态的,则在启动类时无法调用非扩展方法
    • 我又检查了一遍,编译正常。完整代码如下:
    猜你喜欢
    • 2021-02-20
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2017-06-14
    相关资源
    最近更新 更多