Универсальный тип противоречит с Or - PullRequest
4 голосов
/ 18 июля 2011
public T CreateForm<T>() where T: BaseForm, BaseMainForm

Я знаю вышеупомянутые средства, где T представляет собой BaseForm и a BaseMainForm. Но возможно ли также установить ограничение, что T должно быть либо BaseForm , либо a BaseMainForm?

Ответы [ 3 ]

5 голосов
/ 18 июля 2011

Нет, это не разрешено в C #. Компилятор использует универсальное ограничение, чтобы определить, какие операции доступны в T в универсальном методе, поэтому разрешение выражения или не будет безопасным для типа.

Если вам это нужно, рассмотрите возможность добавления интерфейса, охватывающего общие части BaseForm и BaseMainForm, и примените его в качестве общего ограничения. Таким образом, интерфейс определяет контракт того, что нужно методу CreateForm<T>, и вы должны просто убедиться, что формы, которые вы передаете, реализуют интерфейс.

Что-то вроде:

public interface IBaseForm 
{
    Foo();
}

class BaseForm : IBaseForm {}
class BaseMainForm : IBaseForm {}

public T CreateForm<T>() where T : IBaseForm
0 голосов
/ 18 июля 2011

Нет, вам нужно извлечь интересующие CreateForm свойства BaseForm и BaseMainForm в новый интерфейс, от которого они оба наследуются, и тогда ваш метод будет ссылаться на этот интерфейс

0 голосов
/ 18 июля 2011

Это невозможно.

Подумайте о добавлении интерфейса или базового класса, пусть оба эти класса реализуют его и используют его как ограничение типа.

...