任何人都可以解释为什么在switch语句的返回中的转换不能在.net 4中编译?我已经更新了这个例子,以便更准确地了解我的情况。工厂本身实际上不是通用的。convert inherited to generic base
即使铸造“as BaseProductProcessor”也不起作用如果我传入基础产品(实际上是StandardProduct)。现在,如果我明确地将StandardProduct类型传递给工厂,那么就可以了 - 但是我已经定义的是所有调用方法中的Product类型:
如何解决这个问题?
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace testing
{
[TestClass]
public class Test
{
[TestMethod]//fails
public void TestFactoryMethodWithBaseTypePassed()
{
Product product = new testing.StandardProduct();
var pp = new testing.ProductProcessorFactory().Create(product);
Assert.IsNotNull(pp);//fails because T coming into create wasn't the derived type
}
[TestMethod]//passes
public void TestFactoryMethodWithExactType()
{
var pp = new testing.ProductProcessorFactory().Create(new testing.StandardProduct());
Assert.IsNotNull(pp);
}
}
public abstract class BaseProductProcessor<T> where T : Product
{
public T Product { get; set; }
public BaseProductProcessor(T product)
{
Product = product;
}
}
public class StandardProductProcessor : BaseProductProcessor<StandardProduct>
{
public StandardProductProcessor(StandardProduct product)
: base(product)
{
}
}
public class ProductProcessorFactory
{
public ProductProcessorFactory()
{
}
public BaseProductProcessor<T> Create<T>(T product) where T : Product
{
switch (product.ProductType)
{
case ProductType.Standard:
var spp = new StandardProductProcessor(product as StandardProduct);
return spp as BaseProductProcessor<T>;//Nulls if T passed with a Product.. how to explicitly say T is a StandardProduct right here in the factory method so it's centralized?
}
return null;// spp as BaseProductProcessor<T>;
}
}
public class Product
{
public ProductType ProductType { get; set; }
}
public enum ProductType
{
Standard,
Special
}
public class StandardProduct : Product
{
}
}
如果有人创建了一个'ProductProcessorFactory会发生什么'?你可以创建与'BaseProductProcessor '兼容的东西,然后尝试将其转换为'BaseProductProcessor ',这会给你一个ClassCastException。编译器试图告诉你,这个转换不会在所有'T's成功。 –
cdhowie
2013-05-02 18:04:57
更新的代码 - 工厂不是通用的 – 2013-05-03 10:04:04
但方法是,所以你会有同样的问题。 – cdhowie 2013-05-03 16:14:43