views:

224

answers:

2

I'm writing an MSBuild task to upgrade a database (full source here) and encountered an error/by design feature I don't know how to deal with. Basically, if I declare:

public int? TargetVersion
{
    [DebuggerStepThrough]
    get { return targetVersion; }
    [DebuggerStepThrough]
    set { targetVersion = value; }
}

and then attempt to assign a value in an .msbuild file:

<Target Name="Upgrade">
    <UpgradeDatabase ... TargetVersion="10" />
</Target>

MSBuild freaks out and says that

error MSB4030: "10" is an invalid value for the "TargetVersion" parameter of the "UpgradeDatabase" task. The "TargetVersion" parameter is of type "System.Nullable`1[System.Int32]".

How do I assign a value to a nullable property?

+2  A: 

MSBuild doesn't seem to support nullable values then. A workaround would be to use the nullable property internally, but provide a public non-nullable property. This way, the first assignment to the public property will set the internal value from null to a real value, so you have null in a freshly initialized instance, but MSBuild can happily assign its values.

That is, unless there is some way to trick MSBuild into supporting nullables directly :)

OregonGhost
+2  A: 

I would suggest you look into the [Required] tag a bit more. That is how MSBuild handles optional vs required parameters.

Vaccano