9

I have a utility method which returns a strongly typed value from an old .INI configuration type file, with the signature

internal static T GetIniSetting<T>(string config, string key, T defVal = default(T)) 

I want strings to be special, in that I would like the default value for defaultValue to be string.Empty, not default(string) (i.e. null), in the case when the coder hasn't specified a default value.

if (cantFindValueInIniFile == true) { if ((typeof(T) == typeof(string)) && (defaultValue == null)) { // *** Code needed here - Cannot convert string to <T>*** return (T)string.Empty; } return defaultValue; } 

I've tried hard casting, and the as keyword, to no avail.

1
  • Invoking the powers of LSP didn't seem very fitting for this particular case... Commented Jun 8, 2012 at 5:10

3 Answers 3

14

The 'hacky' way:

return (T)(object)string.Empty; 

Notes:

  • Pretty safe as you have check pre-conditions.
  • Performance penalty unnoticeable on reference types.
Sign up to request clarification or add additional context in comments.

Comments

7

You have to do it like this: (T)(object)(string.Empty).

Also, a minor optimization is to store this in a static readonly string field so that you don't have to do the casts but one time per generic parameter (instead of per method call)

2 Comments

Very minor optimization... casts are "pretty darn fast".
@pst, true, (with reference types, at least) but why not?
0

If I'm not mistaken, the last parameter in GetIniSetting is optional, and you will get default(string) only if you don't provide anything for it. So to use string.Empty as a default string value make the call like:

string value = GetIniSetting<string>(config, key, string.Empty); 

2 Comments

You are mistaken. A string is a reference type, so you can pass in null
(And default(string) evaluates to null)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.