ограничить T значением int? - PullRequest
3 голосов
/ 23 апреля 2010

Как я могу решить эту ошибку MSG?

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

ошибка

Type of conditional expression cannot be determined because there is no implicit conversion between 'T' and 'int

Ответы [ 7 ]

14 голосов
/ 23 апреля 2010

Если вы хотите, чтобы T было int, принимайте int, а не T. В противном случае рассмотрите возможность возврата по умолчанию (T), если b == false.

return b ? v : default(T);

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

5 голосов
/ 23 апреля 2010

Если вы хотите вернуть значение по умолчанию для T:

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

Таблица значений по умолчанию
ключевое слово по умолчанию в общем коде

5 голосов
/ 23 апреля 2010

Почему вы пытаетесь использовать дженерики, если вам нужен только 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 для объектов ...

2 голосов
/ 23 апреля 2010

Srsly!

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

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

Тад! :)

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

2 голосов
/ 23 апреля 2010

Если есть только допустимый тип для 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);
}
2 голосов
/ 23 апреля 2010

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

2 голосов
/ 23 апреля 2010

Нет способа сделать это в C #. Вы можете сделать

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

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

default(T), что равно 0, когда T является целым числом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...