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预期错误。有什么问题 ?
答案 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()
{
}
}
}