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



Answers

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

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

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

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

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

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

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

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

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

C #

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

VB

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

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

Например:

public interface IGenericFace<T : BaseClass>
{
}

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

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







Links



Tags

c# c#   generics