如果不支持T类型,应该抛出什么异常?

时间:2019-06-26 20:56:20

标签: c# exception

我在这里查看了一些类似的问题,并在网络上浏览了几篇文章,但仍未得出一个可靠的结论来解决这个问题。我读过的所有内容似乎都与抛出ArgumentExceptionArgumentOutOfRangeException之类的东西有关。但是,我不认为这些基于我到目前为止所读的内容。如果它们确实适用于我的情况,您能否解释一下(并提供文档)为什么最合适?

我有一个通用类Foo<T>,它具有类型T的属性。类型T仅在类型BarBarFoo中之一时才有效。因此,如果T是无效的类型,则构造函数中将引发异常:

public class Foo<T> {
    public T ID { get; private set; }
    public Foo(T id) {
        if (typeof(T) != typeof(Bar) || typeof(T) != typeof(BarFoo))
            throw new Exception("Invalid type message goes here...");

        if (id is Bar)
            ID = (Bar)(object)id;
        else if (id is BarFoo)
            ID = (BarFoo)(object)id;
    }
}

这是一个简单的示例,但由于在创建对象时指定了T,因此我不确定在这种情况下应该抛出什么异常:

Foo<int> myFoo = new Foo<int>(3);

在类级别而不是方法级别提供T的类型时,应该引发什么异常?如果两者都被相同对待,那么请提供关于为何如此的详尽解释。

注意

问题已结案,此后设计也已更改。我建议查看重复的内容或下面的答案。无需进一步评论。

1 个答案:

答案 0 :(得分:1)

这里没有合适的异常类型,因为这种情况没有道理

我会重新考虑您的设计。您声称 Foo是通用的,但是它只能接受两个假设为正交的类型之一。如果BarBarFoo之间没有通用的基本类型或接口,那么 Foo如何通用

您对ID做些什么,它们可以应用于BarBarFoo(但无其他事项)而不会产生反射或产生大量开关,具体取决于类型?

您可以尝试创建具有具体实现的abstract泛型类型:

public abstract Foo<T> {
}

public FooBar : Foo<Bar> { 
}

public FooBarFoo : Foo<BarFoo> {
}

但是没有什么可以阻止某人实现使用除BarBarFoo之外的其他类型的另一类型。但是至少没有一种 easy 方式可以使用其他类型。