вы можете использовать
string.find("substring")
Это должно сделать это
Компилятор C # не должен рассматривать ограничения типов как часть сигнатуры метода, потому что они не являются частью сигнатуры метода для CLR. Было бы катастрофой, если бы разрешение перегрузки сработало по-разному для разных языков (в основном из-за динамического связывания, которое может произойти во время выполнения и не должно отличаться от одного языка к другому, иначе все ады будут разрываться).
Почему было решено, что эти ограничения не будут частью сигнатуры метода для CLR, это еще один вопрос, и я мог только сделать плохо информированные предположения об этом. Я дам понять, что люди в курсе.
Если 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() { }
}