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

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

Есть ли способ предоставить тип по умолчанию для параметра T общего типа, например:

class Something<T = string>
{
}

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

Другое дело, могу ли я ограничить общий тип ValueType? Я только что видел, что вы не можете, но тем не менее, я хотел бы знать, почему. Кто-нибудь знает?

Спасибо!

4b9b3361

Ответ 1

Хорошо, я полагаю, у вас есть класс:

class Something<T>
{

}

Теперь вам может понадобиться другой класс:

class Something : Something<string>
{
    // NO MORE CODE NEEDED HERE!
}

Это единственный и лучший способ.
Поэтому, если вы используете Something, он фактически использует Something<string>.

Ответ 2

Вы можете использовать ключевое слово where, чтобы ограничить конкретные типы, которые могут использоваться как параметры типа.

Например, ваш класс может принимать только общие параметры типа, где тип реализует интерфейс IComparable:

class Something<T> where T : IComparable
{
}

Или, как вы упомянули, вы можете ограничить T как тип значения с помощью where T : struct:

class Something<T> where T : struct
{
}

Для получения дополнительной информации см. статью MSDN в Ограничения по параметрам типов. Надеюсь, это поможет!

Ответ 3

В соответствии с docs вы можете ограничить T как тип значения, используя ключевое слово where

where T: struct

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

class Something<T> where T: struct {
  ...
} 

Хотя string не является типом значения, и вы не сможете использовать его с таким ограничением. Может быть, IComparable будет лучше, если вы захотите также использовать тип string.

Что касается указания типа по умолчанию, я не считаю, что это возможно.

Ответ 4

Я не верю, что есть способ присвоить его определенному типу, но вы можете поместить это как комментарий в документы XML. Что касается ограничения типа значения, вы можете получить это поведение, объявив свой общий текст следующим образом:

class MyGeneric<T> where T : struct
{
    ...
}

Ответ 5

class Something<T> where T : string
{
}; // eo class Something<>

Ответ 6

Вам нужен подкласс. Недавно мне нужно было что-то вроде этого, это мое решение:

    public abstract class MyGenericClass<T1, T2>
    {
        public abstract void Do(T1 param1, T2 param2);
    }

    public class Concrete : MyGenericClass<string, int?>
    {        
        public override void Do(string param1, int? param2 = null)
        {
            Console.WriteLine("param1: {0}", param1);

            if (param2 == null)
                Console.WriteLine("param2 == null");
            else
                Console.WriteLine("param2 = {0}", param2);

            Console.WriteLine("=============================================");
        }        
    }

Вы можете вызвать метод:

    string param1 = "Hello";
    Concrete c = new Concrete();
    c.Do(param1);
    c.Do(param1, 123);
    c.Do(param1, (int?)null);
    /*  Result:
    param1: Hello
    param2 == null
    =============================================
    param1: Hello
    param2 = 123
    =============================================
    param1: Hello
    param2 == null
    =============================================
    */

Я предпочитаю использовать нулевые значения по умолчанию, так как я читаю это: С# In Depth - необязательные параметры и именованные аргументы