15

这是 Visual Studio 2008。显然与扩展的静态类有关。

public class Dummy
{
    public readonly int x;

    public Dummy(int x)
    {
        this.x = x;
    }

    public override string ToString()
    {
        return x.ToString();
    }
}

[Obsolete("Do Not Use", true)]
public static class Extensions
{
    public static int Squared(this Dummy Dummy)
    {
        return Dummy.x * Dummy.x;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var d = new Dummy(42);
        Console.WriteLine(String.Format("{0}^2={1}", d, d.Squared()));
    }
}
4

5 回答 5

9

在 VS2010 中也是如此。看起来像一个错误。我会把它输入数据库。

您可以通过将属性放在实际方法上来解决该错误。

感谢您的报告!

于 2011-05-10T21:30:42.620 回答
2

调用过时的函数是一个警告,而不是错误,除非您更改编译器设置以停止警告 - 使警告表现得像错误。

通常,除非我的代码中存在其他“真实”错误,否则我不会看到这些警告。

另请注意,在您的特定情况下,您将类标记为过时 - 而不是方法。这可能很重要。

于 2011-05-10T20:56:39.707 回答
2

因为它是一种扩展方法,所以您不会直接访问静态类,编译器会生成该代码。

相反,如果您Squared显式访问该方法,则会收到编译时错误。

Extensions.Squared(d)

但是,由于这是一个扩展方法,您只能隐式调用该方法,因此需要将属性应用于方法本身。

public static class Extensions
{
    [Obsolete("Do Not Use", true)]
    public static int Squared(this Dummy Dummy)
    {
        return Dummy.x * Dummy.x;
    }
}

另一方面,完全删除(或重命名)该类将达到相同的目的——在这种情况下,您肯定会遇到编译时错误。:)

编辑您可以在此处
向 Microsoft 提交错误报告。这似乎是应该由编译器处理的行为。

于 2011-05-10T21:02:03.190 回答
2

我认为您发现了一个编译器错误

虽然扩展方法将被编译为静态方法用法,但编译器似乎没有检查它,因为在编译时它以实例方法调用的格式存在


原因就在这里。如果我声明第二种方法:

[Obsolete("Do Not Use", true)]
public static class Extensions
{
    public static int Squared(this Dummy Dummy)
    {
        return Dummy.x * Dummy.x;
    }

    public static int Squared2(Dummy Dummy)
    {
        return Dummy.x * Dummy.x;
    }

}

现在它在第三行而不是第二行抱怨:

class Program
{
    static void Main(string[] args)
    {
        var d = new Dummy(42);
        Console.WriteLine(String.Format("{0}^2={1}", d, d.Squared())); // Fine!?
        Console.WriteLine(String.Format("{0}^2={1}", d, Extensions.Squared2(d))); // COmplains as expected
    }
}
于 2011-05-10T21:06:42.933 回答
0

我认为您需要将属性放在 Squared 上,而不是类上。

于 2011-05-10T20:56:42.093 回答