Расширение VB.NET для объекта Nullable (Of T), выдает ошибку типа - PullRequest
4 голосов
/ 29 октября 2010

Код, с которым я хочу работать:

<Extension()>
Public Function NValue(Of T)(ByVal value As Nullable(Of T), ByVal DefaultValue As T) As T
    Return If(value.HasValue, value.Value, DefaultValue)
End Function

Итак, в основном я хочу, чтобы он выдавал значение по умолчанию для обнуляемого объекта, и в зависимости от того, является ли он нулевым или нет, онвыдаст свое собственное значение или значение по умолчанию.

Таким образом, с объектом Date он сделает это, что работает, но я не могу заставить его работать с универсальным T:

<Extension()>
Public Function NValue(ByVal value As Date?, ByVal DefaultValue As Date) As Date
  Return If(value.HasValue, value.Value, DefaultValue)
End Function

Dim test As Date? = Nothing
Dim result = test.NValue(DateTime.Now)

Переменная 'result' теперь имеет текущий DateTime.

Когда я пробую это с T, я получаю это как ошибку (которую Visual Studio помещает в T в Nullable (Of T): Type 'T'должен быть типом значения или аргументом типа, ограниченным значением' Structure 'для использования с' Nullable 'или модификатором Nullable'? '.

Большое спасибо за любую помощь!

Привет

Ответы [ 3 ]

8 голосов
/ 29 октября 2010

Попробуйте:

Public Function NValue(Of T as Structure)(ByVal value As Nullable(Of T as Structure), ByVal DefaultValue As T) As T

Я не уверен, нужны ли вам оба условия as Structure или нет.

Обновление

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

Public Function NValue(Of T as Structure)(ByVal value As Nullable(Of T), ByVal DefaultValue As T) As T
3 голосов
/ 29 октября 2010

Ваша функция немного избыточна, потому что то же самое может быть достигнуто с помощью If:

Dim nullval As Integer? = Nothing
Dim value  = If(nullval, 42)

Это то же самое, что вы написали, а именно:

Dim value = If(nullval.HasValue, nullval.Value, 42)

Это эквивалентно нулевому оператору приведения в C # ?? (var value = nullval ?? 42;).

1 голос
/ 13 августа 2012

Я искал ответ на этот вопрос и был доволен решением Эндрю Купера, но я не мог заставить его работать на практике, хотя оно будет компилироваться. Если бы я попытался вызвать метод расширения для рассматриваемого Nullable, я бы не увидел свой метод расширения в списке доступных методов. Если бы я вызвал его напрямую, я получил бы следующую ошибку: «System.Nullable» не удовлетворяет ограничению «Structure» для параметра типа «T». Допускаются только типы, не имеющие значения «Structure». Я нашел возможное объяснение этой ошибки здесь .

Я использовал перегрузку GetValueOrDefault () без параметров, так как она, казалось, достигла моей первоначальной цели. После некоторого исследования мне приятно, что GetValueOrDefault () является адекватным, если не предпочтительным решением. В случае FrieK я бы предпочел использовать перегрузку GetValueOrDefault () с defaultValue в качестве параметра.


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