谁能解释为什么 switch 语句中的 return 转换不能在 .net 4 中编译?我已经更新了示例以更准确地适应我的情况。工厂本身实际上并不通用。
如果我传入一个基本产品(实际上是一个标准产品),即使投射“作为 BaseProductProcessor”也不起作用。现在,如果我明确地将 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
    {
    }
}