简体   繁体   中英

Cast string.Empty to (generic) T in C#?

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) (ie 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.

The 'hacky' way:

return (T)(object)string.Empty; 

Notes:

  • Pretty safe as you have check pre-conditions.
  • Performance penalty unnoticeable on reference types.

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)

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM