В чем смысл модификатора "static new" для функции?

сегодня, я нашел что-то в старом коде. Он имеет "статическое новое" для одной функции. Похоже на то.

class Foo
{
    public static void Do()
    {
        Console.WriteLine("Foo.Do");
    }
}

class Bar: Foo
{
    public static new void Do()
    {
        Console.WriteLine("Bar.Do");
    }
}

Я не понимаю статический новый модификатор для Do метод в классе бар. В C# статический метод может быть вызван с имени класса вместо имени объекта. Поэтому я не думаю, что есть какая-то разница между "новым" и "нет".

вообще, если какой-то синтаксис не нужен, C# просто лечить это ошибка. Кто-нибудь знает, почему C# допускает такой синтаксис?

4 ответов


Если убрать new из вашего кода, Вы получаете:

предупреждение CS0108: 'бар.Do () 'скрывает унаследованный член' Foo.Do ()'. Используйте ключевое слово new, если было запланировано скрытие.

компилятор C# просто предупреждает Вас, что вы, возможно, делаете что-то, что вы не намеревались, и просит вас вставить new ключевое слово, чтобы подтвердить, что вы знаете, что вы делаете. Кроме подавления предупреждения, у него нет других эффектов.


это относится только к внешним абонентам. Помните, что вы можете вызвать статический метод базового класса, поэтому что-то вроде этого допустимо:

class Foo
{
    public static void Do() { Console.WriteLine("Foo.Do"); }
}
class Bar : Foo // :Foo added
{
    public static void Something()
    {
        Do();
    }
}

вот почему предупреждение говорит вам поставить новое, вы хотите избежать путаницы при этом:

class Foo
{
    public static void Do() { Console.WriteLine("Foo.Do"); }
}
class Bar : Foo // :Foo added
{
    public static void Something()
    {
        Do();
    }
    public static new void Do() { Console.WriteLine("Bar.Do"); }
}

посмотреть этой

public class BaseC
{
    public static int x = 55;
    public static int y = 22;
}

public class DerivedC : BaseC
{
    // Hide field 'x'.
    new public static int x = 100;

    static void Main()
    {
        // Display the new value of x:
        Console.WriteLine(x);

        // Display the hidden value of x:
        Console.WriteLine(BaseC.x);

        // Display the unhidden member y:
        Console.WriteLine(y);
    }
}
/*
Output:
100
55
22
*/

ваш пример, чтобы было ясно, должен быть

public class Foo
{
    public static void Do() {}
}
public class Bar :Foo
{
    public new static void Do() {}
}

в вашем примере панель второго класса, похоже, не наследуется от Foo. Это кажется опечаткой, потому что иначе это не имеет смысла.

предполагая, что это опечатка, модификатор " new " явно скрывает версию базового класса функции Do(). Это означает, что производная версия Do() метод эффективно заменяет версию базового класса.

использование "new" здесь документирует тот факт, что унаследованный метод предназначен в качестве замены версия базового класса Do().

для получения дополнительной информации см. раздел новый модификатор (C#)