【问题标题】:Cast string.Empty to (generic) T in C#?在 C# 中将 string.Empty 转换为(通用)T?
【发布时间】:2012-06-08 04:49:05
【问题描述】:

我有一个实用方法,它从旧的.INI 配置类型文件返回强类型值,带有签名

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

我希望字符串是特殊的,因为我希望 defaultValue 的默认值为 string.Empty,而不是 default(string)(即 null),以防编码器没有t 指定了一个默认值。

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

我尝试过强制转换,以及 as 关键字,但无济于事。

【问题讨论】:

  • 调用 LSP 的力量似乎不太适合这种特殊情况......

标签: c# generics casting


【解决方案1】:

'hacky'方式:

return (T)(object)string.Empty; 

注意事项:

  • 非常安全,因为您有检查前提条件。
  • 引用类型的性能损失不明显。

【讨论】:

    【解决方案2】:

    你必须这样做:(T)(object)(string.Empty)

    另外,一个小的优化是将它存储在一个静态只读字符串字段中,这样您就不必进行强制转换,而是每个泛型参数一次(而不是每个方法调用)

    【讨论】:

    • 非常次优化...演员“非常快”。
    • @pst, true, (至少有引用类型)但为什么不呢?
    【解决方案3】:

    如果我没记错的话,GetIniSetting 中的最后一个参数是可选的,只有在不提供任何内容的情况下才会得到 default(string)。所以要使用 string.Empty 作为默认字符串值,调用如下:

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

    【讨论】:

    • 你错了。字符串是引用类型,所以可以传入null
    • (而default(string) 的计算结果为null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2012-03-08
    • 2013-10-14
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多