c# - 不明确的通用限制 T :class vs T:struct

标签 c# generics

此代码会生成一个编译器错误,指出该成员已使用相同的参数类型进行定义。

   private T GetProperty<T>(Func<Settings, T> GetFunc) where T:class
    {
        try
        {
            return GetFunc(Properties.Settings.Default);
        }
        catch (Exception exception)
        {
            SettingReadException(this,exception);
            return null;
        }
    }

    private TNullable? GetProperty<TNullable>(Func<Settings, TNullable> GetFunc) where TNullable : struct
    {
        try
        {
            return GetFunc(Properties.Settings.Default);
        }
        catch (Exception ex)
        {
            SettingReadException(this, ex);
            return new Nullable<TNullable>();
        }
    }

有干净的解决办法吗?

最佳答案

通用类型约束不能用于重载解析,但您实际上不需要为此使用重载方法。只需使用 default 而不是 null:

private T GetProperty<T>(Func<Settings, T> GetFunc)
{
    try
    {
        return GetFunc(Properties.Settings.Default);
    }
    catch (Exception exception)
    {
        SettingReadException(this,exception);
        return default(T);
    }
}

哦,我已经逐字复制了您的代码,但是不要像这样吞下一般的Exception。捕获您实际预期可能抛出的特定异常。您不希望此代码无意中吞掉 OutOfMemoryExceptionBadImageFormatException 实例。

关于c# - 不明确的通用限制 T :class vs T:struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2718442/

相关文章:

c# - Moq - 如何设置惰性界面

c# - 我可以让 Visual Studio 忽略异常的特定*实例*吗?

c# - 这对 sql 注入(inject)安全吗?

c# - 从 ffmpeg 标准输出的单个流中获取多个图像

c# - 泛型无法推断第二个参数?

java - 在这种情况下如何正确使用泛型?

c# - BlockingCollection.TakeFromAny 方法是否适合构建阻塞优先级队列?

swift - 如何将类型为 Class<Class Implementing Protocol> 的值存储在类型为 [String :Class<Protocol>] in Swift? 的字典中

java - 奇怪的 Java 泛型编译错误 : parameterized method is not applicable for same parameterized types?

python - 带有 generics.ListCreateAPIView 的 Django REST 框架外键