2010-04-23 4 views

ответ

2

Там нет никакого способа сделать это в C#. Вы можете сделать

where T: struct и заставить T быть типом значения, но этого все еще недостаточно.

Или вы можете сделать

default(T), которое 0 при T является внутр.

+1

Разве вы не говорите, что нет способа это сделать, а затем перечислите 2 способа сделать это? :) –

+0

В C# нет способа сказать «T должно быть числового типа». Мои два подхода (которые я бы использовал оба вместе на самом деле) - лучшая группа, которую вы получите :) Хотя, действительно, я бы, вероятно, принял совершенно другой подход к этой проблеме. –

+0

@Jeff, он говорит, что нет способа остановить T до int, что верно. Первый пример показывает, как он может, по крайней мере, ограничиваться типом значения. Второй показывает, как должно быть построено значение возвращаемого значения по умолчанию, которое будет работать для int, double, DateTime, object, Foo и т. Д. –

14

Если вы хотите T быть INT, принять Int, а не T. В противном случае, считают возвращающегося по умолчанию (T), если б == ложь.

return b ? v : default(T);

Если T является INT, то он вернет 0. Если это ссылочный тип, он будет нулевым. И дальше и дальше ..

5

Почему вы пытаетесь использовать дженерики, если хотите только int?

// No need to compare b to true... 
public static int val(this bool b, int v) { return b ? v : 0; } 

В противном случае используйте default(T), как упомянули другие.

public static T val<T>(this bool b, T v) { return b ? v : default(T); } 

default(T) по умолчанию 0 для int с и других числовых значений, false для bool с, null для объектов ...

+0

Я подозреваю, что он хочет поддерживать int, long, double и т. Д., Поэтому возврат по умолчанию (T), вероятно, является лучшим вариантом. – Ryan

2

Попробуйте заменить v : 0 на v : default(T), если у вас есть веские причины для генериков. Если вам нужно ограничить его на int, тогда вы не пишете общий класс.

+0

Я предполагаю, что он действительно не хочет int, но все числовые типы (длинный, короткий, двойной и т. Д.). –

+0

Хотелось бы, чтобы у нас был этот вариант, иногда. (Или ограничения типов, которые поддерживают определенные математические операторы). – JasonTrue

2

Если есть только допустимый тип для T, то он не должен быть универсальным:

public static int val(this bool b, int v) 
{ 
    return b ? v : 0; 
} 

Если вы хотите, чтобы это работало для любого типа значений, вы могли бы сделать это:

public static int val<T>(this bool b, T v) where T : struct 
{ 
    return b ? v : default(T); 
} 
+1

Нет никакой особой причины, чтобы этот код нуждался в 'where T: struct'. –

2

Srsly!

Чтобы «ограничить T в целое» вы воспользоваться специальной функцией компилятора, известного как strong-typing:

static public class Blah 
{ 
    public static int val(this bool b, int v) { return b == true? v:0; } 
} 

Тада! :)

Серьезно, почему вы используете дженерики?

Смежные вопросы