VS2008中.net 2.0中的扩展方法

时间:2011-08-29 21:28:22

标签: c# .net

  public static class Helper
  {
    public static float ToFloat(this string input)
    {
      float result;
      return float.TryParse(input, out result) ? result : 0;
    }
  }

我在顶部添加了以下内容:

namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Method)]
    public class ExtensionAttribute : Attribute
    {
        public ExtensionAttribute()
        {

        }
    }
}

但是我仍然在Helper类中的“this”上得到Type预期错误。有什么问题 ?

2 个答案:

答案 0 :(得分:2)

很奇怪,以下针对.NET 2.0编译并运行正常:

using System;

namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Method)]
    public class ExtensionAttribute : Attribute
    {
        public ExtensionAttribute()
        {

        }
    }
}

public static class Helper
{
    public static float ToFloat(this string input)
    {
        float result;
        return float.TryParse(input, out result) ? result : 0;
    }
}

class Program
{
    static void Main()
    {
        string foo = "123";
        Console.WriteLine(foo.ToFloat());
    }
}

答案 1 :(得分:1)

修改

它在命令行应用程序中工作的原因是因为msbuild知道2.0 .NET CLR可以处理扩展方法(因为它们只是带有一些语法糖的静态方法)。

在编译项目时,msbuild会检查.csproj文件以了解如何编译,目标是什么等。

但是在编译网站时,没有.csproj文件,因此msbuild无法检查如何编译。现在发生的是csc,命令行编译器,使用如何编译的参数启动。因此,在编译.Net 2.0网站时,它会选择2.0编译器。但是2.0编译器对如何编译扩展方法一无所知,因此错误。

您还可以注意到,如果您为常规项目在高级下设置构建选项以使用ISO-2,它将警告您不能使用扩展方法。但是2.0编译器甚至不识别扩展方法,所以它只是告诉你不能使用this

原帖:

我认为您的代码中存在其他问题,这在.net 2.0中编译得很好:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string test = "0.0";
            float f = test.ToFloat();
        }

    }
    public static class Helper
    {
        public static float ToFloat(this string input)
        {
            float result;
            return float.TryParse(input, out result) ? result : 0;
        }
    }
}
namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Method)]
    public class ExtensionAttribute : Attribute
    {
        public ExtensionAttribute()
        {

        }
    }
}