Interface Generic Inheriting Предупреждение компилятора 108, 114 C # [дубликат]

вы можете использовать

 string.find("substring")

Это должно сделать это

8
задан Daryl 26 February 2012 в 03:28
поделиться

2 ответа

Компилятор C # не должен рассматривать ограничения типов как часть сигнатуры метода, потому что они не являются частью сигнатуры метода для CLR. Было бы катастрофой, если бы разрешение перегрузки сработало по-разному для разных языков (в основном из-за динамического связывания, которое может произойти во время выполнения и не должно отличаться от одного языка к другому, иначе все ады будут разрываться).

Почему было решено, что эти ограничения не будут частью сигнатуры метода для CLR, это еще один вопрос, и я мог только сделать плохо информированные предположения об этом. Я дам понять, что люди в курсе.

4
ответ дан Falanwe 27 August 2018 в 05:40
поделиться

Если T соответствует нескольким ограничениям, вы создаете неоднозначность, которая не может быть автоматически разрешена. Например, у вас есть один общий класс с ограничением

where T : IFirst

, а другой с ограничением

where T : ISecond

Вы теперь хотим, чтобы T был классом, который реализует как IFirst, так и ISecond.

Пример кода бетона:

public interface IFirst
{
    void F();
}

public interface ISecond
{
    void S();
}

// Should the compiler pick this "overload"?
public class My<T> where T : IFirst
{
}

// Or this one?
public class My<T> where T : ISecond
{
}

public class Foo : IFirst, ISecond
{
    public void Bar()
    {
        My<Foo> myFoo = new My<Foo>();
    }

    public void F() { }
    public void S() { }
}
0
ответ дан Eric J. 27 August 2018 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: