Nullablle <> и "null" в F # - PullRequest
       1

Nullablle <> и "null" в F #

5 голосов
/ 02 сентября 2010

Я вызываю функции в платформе XNA из F #, которые принимают значения Nullable.Теперь, в C #, вы бы просто позвонили:

foo(arg1, arg2, null, arg4)

Теперь я попробовал это в F #, но это не нравится.В нем говорится: «Ошибка 9 Несоответствие ограничений типа. Тип« a несовместим с типом System.Nullable. Тип «System.Nullable» не имеет значения «null» в качестве правильного значения ».

Я понимаю, почемуэто происходит, вроде как, но это кажется действительно неудобным.Все, что я сейчас делаю, - это чтобы облегчить жизнь, вместо того, чтобы постоянно набирать (Nullable<Rectangle>)null каждый раз, когда я вызываю функцию, я просто делал let nullRect = (Nullable<Rectangle>)null и использую nullRect.Это кажется действительно глупым, особенно если учесть, что я должен делать это для каждого типа nullable, с которым я взаимодействую.Есть ли лучший, более идиоматический способ справиться с этим?

Ответы [ 2 ]

3 голосов
/ 02 сентября 2010

Если вы не хотите использовать очень умный ответ kvb, во многих случаях вы можете опустить конкретный тип и просто использовать Nullable<_>() - F # может определить, какой тип Nullable вы имеете в виду.

3 голосов
/ 02 сентября 2010

Вот что я бы сделал:

[<GeneralizableValue>]
let nl<'a when 'a : struct
           and 'a : (new : unit -> 'a)
           and 'a :> System.ValueType> : System.Nullable<'a> =
  unbox null

Теперь вы можете использовать nl везде, где вы использовали бы null раньше.

EDIT

Как отмечает Томас, это можно записать гораздо более кратко, как:

let nl = System.Nullable<_>()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...