我有一个简单的工厂方法,它提供了一个基于提供的泛型类型参数的具体实现实例.如果具体类继承自具有类型参数的公共抽象基类,则无法强制转换它们.编译告诉我Error 2 Cannot convert type 'Car' to 'VehicleBase<T>'.如果我用抽象类替换具有相同类型参数的接口,或者如果我从抽象类中删除泛型类型参数,它工作正常.
interface IWheel
{
}
class CarWheel : IWheel
{
}
abstract class VehicleBase<T>
{
}
class Car : VehicleBase<CarWheel>
{
}
class VehicleFactory
{
public static VehicleBase<T> GetNew<T>()
{
if (typeof(T) == typeof(CarWheel))
{
return (VehicleBase<T>)new Car();
}
else
{
throw new NotSupportedException();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这无法编译(VehicleBase<T>)new Car().这是一个编译器缺陷,或者这是一个故意的设计决策,以不同的方式处理抽象类和接口与类型参数?
作为一种解决方法,我总是可以使抽象类实现一个接口并将其用作我的工厂方法的返回值,但我仍然想知道为什么会发生这种行为.
C#编译器似乎并不关心我是否在throw语句后面有一个return语句,即使throw它很明显无法访问.相反的情况并非如此:编译器可以检测到a return之后throw无法访问.这是编译器缺陷吗?
编译好:
string MyProperty
{
get
{
return "";
throw new InvalidOperationException();
}
}
string MyMethod()
{
return "";
throw new InvalidOperationException();
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,失败的return声明:
string MyOtherProperty
{
get
{
throw new InvalidOperationException();
return "";
}
}
string MyOtherMethod()
{
throw new InvalidOperationException();
return "";
}
Run Code Online (Sandbox Code Playgroud)
编辑:这是使用.NET 4.5.1,C#版本5.0.
编辑2:这是我在编译第二个选项时看到的警告(在返回之前抛出): Unreachable code detected