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

コンパイラのバグを発見したと思います:

拡張メソッドは静的メソッドの使用法にコンパイルされますが、コンパイル時にインスタンス メソッド呼び出しの形式で存在するため、コンパイラはチェックしないようです。


理由はここにあります。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;
    }

}

これで、2 行目ではなく 3 行目で問題が発生します。

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 に答える
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

廃止された関数の呼び出しは警告であり、エラーではありません。ただし、コンパイラの設定を警告時に停止するように変更しない限り、警告がエラーのように動作するようにします。

通常、コードに他の「実際の」エラーがない限り、これらの警告は表示されません。

また、特定のケースでは、メソッドではなくクラスを廃止としてマークしたことに注意してください。それは問題かもしれません。

于 2011-05-10T20:56:39.707 に答える
0

クラスではなく、Squared に属性を設定する必要があると思います。

于 2011-05-10T20:56:42.093 に答える