Improving F# conditional assignment with match expression
Thanks to the input provided in the other answers, here's what I've come up with:

let label = 
    let (found, value) = this.counters.TryGetValue(t)
    this.counters.[t] &lt;- value + 1
    if found 
    then (sprintf "%s (%i)" t.Name (value + 1)) 
    else t.Name


Or using a match expression

let label = 
    let (found, value) = this.counters.TryGetValue(t)
    this.counters.[t] &lt;- value + 1
    match found with 
    | true -&gt; (sprintf "%s (%i)" t.Name (value + 1)) 
    | false -&gt; t.Name


I've also refactored this into a separate function, so the actual assignment is just

let label = getNextLabel(t)


Both of these look better than my original code, though I'm not sure that the match has added any expressiveness to the code, so for now I'm keeping the plain old if / else statement. This is mostly just taking advantage of the built-in behavior of dictionaries in .NET (TryGetValue returns the default value if the key is not found, and the Item property's setter will perform an insert if necessary), but I'm still open to any suggestions on improving this more.