2011-08-29 100 views
3
public static class Helper 
    { 
    public static float ToFloat(this string input) 
    { 
     float result; 
     return float.TryParse(input, out result) ? result : 0; 
    } 
    } 

我已经添加在顶部以下内容:扩展方法在.NET 2.0中VS2008

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

     } 
    } 
} 

但我仍然得到“这个”,在助手类类型预期的错误。有什么问题 ?

+2

@詹姆斯,定义一个扩展方法,当然可以。事实上,你必须。但不早于2.0。 :) – bzlm

+0

@James'这个'在他使用它的方式是正常的扩展方法 –

+3

看到这个http://msdn.microsoft.com/en-us/magazine/cc163317.aspx#S7 –

回答

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

我可以做一个新的控制台应用程序,但不是在我的.net 2.0网站奇怪原因。需要研究它。 – Learner

+0

@Learner我认为我知道为什么这不起作用的网站。请查看我的答案 –

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() 
     { 

     } 
    } 
}