Подтвердить что ты не робот

Могут ли генераторы С# иметь определенный базовый тип?

Возможно ли, чтобы общий тип интерфейса был основан на определенном родительском классе?

Например:

public interface IGenericFace<T : BaseClass>
{
}

Очевидно, что приведенный выше код не работает, но если это так, то я пытаюсь сказать компилятору, что T должен быть подклассом BaseClass. Это можно сделать, есть ли планы на это и т.д.?

Я думаю, что это было бы полезно с точки зрения конкретного проекта, убедившись, что общий интерфейс/класс не используется с непреднамеренными типами (типами) во время компиляции. Или также для сортировки самодокумента: покажите, какой тип предназначен.

4b9b3361

Ответ 1

public interface IGenericFace<T> where T : SomeBaseClass

Ответ 2

То, о чем вы говорите, называется "Общие ограничения". Существует множество ограничений, которые могут быть применены к родовому типу.

Вот некоторые основные примеры:

  • where T: struct - Аргумент типа должен быть типом значения. Можно указать любой тип значения, кроме Nullable -. См. Использование Nullable Types (Руководство по программированию на С#) для получения дополнительной информации.

  • where T : class - Аргумент типа должен быть ссылочным типом; это относится также к любому типу класса, интерфейса, делегата или массива.

  • where T : new() - Аргумент типа должен иметь открытый конструктор без параметров. При использовании вместе с другими ограничениями ограничение new() должно быть указано последним.

  • where T : <base class name> - Аргумент типа должен быть или выводиться из указанного базового класса.

  • where T : <interface name> - Аргумент типа должен быть или реализовать указанный интерфейс. Можно указать несколько ограничений интерфейса. Сдерживающий интерфейс также может быть общим.

  • where T : U - Аргумент типа, предоставленный для T, должен быть или получен из аргумента, предоставленного для U. Это называется ограничением голого типа.

Они также могут быть связаны между собой следующим образом:

С#

public class TestClass<T> where T : MyBaseClass, INotifyPropertyChanged, new() { }
public interface IGenericFace<T> where T : SomeBaseClass

В. Б.

Public Class TestClass(Of T As {MyBaseClass, INotifyPropertyChanged, New})
Public Interface IGenericInterface(Of T As SomeBaseClass)

Ответ 3

да.

public interface IGenericFace<T>
    where T : BaseClass
{
}