В любом случае, чтобы установить общий параметр для определенного типа?
Есть ли способ предоставить тип по умолчанию для параметра T общего типа, например:
class Something<T = string>
{
}
Я знаю, что для этого не так уж много веских причин, но я хотел бы напомнить клиенту кода, который он должен использовать предпочтительно.
Другое дело, могу ли я ограничить общий тип ValueType
? Я только что видел, что вы не можете, но тем не менее, я хотел бы знать, почему. Кто-нибудь знает?
Спасибо!
Ответы
Ответ 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 - необязательные параметры и именованные аргументы