在编译时检查泛型参数

时间:2011-10-17 09:05:46

标签: c# generics

说我有以下课程:

public class MyClass<T>
{
    public MyClass() {
        //construct logic
    }

    public IProperty<T> MyProperty { get; set; }
}

public interface IProperty<T> { }

public DateTimeProperty : IProperty<DateTime>
{

}

如果我尝试将此代码放入MyClass

的构造函数中
if (typeof(T) == typeof(DateTime))
    MyProperty = new DateTimeProperty();

我收到以下编译错误:

  

无法将类型'DateTimeProperty'隐式转换为'IProperty'

我怎样才能在MyClass的构造函数中将MyProperty的值设置为new DateTimeProperty,只有当T的类型为DateTime时?

3 个答案:

答案 0 :(得分:3)

请注意,泛型应该是这样的; 通用;你正在做的是专业(对于某些T),这有点不重要。但是,至于如何 - cast:

MyProperty = (IProperty<T>)(object)new DateTimeProperty();

通过转换为object然后返回到(IProperty<T>),您将删除编译器应用静态类型检查规则的能力。缺点是:你删除了编译器应用静态类型检查规则的能力

答案 1 :(得分:1)

虽然这只是一种风格差异,但我更喜欢Marc的建议:

((MyClass<DateTime>)this).MyProperty = new DateTimeProperty();

答案 2 :(得分:0)

我认为你不应该这样做因为那时泛型不再是通用的,正如Marc所说,如果你有一个实现你所需要的基类,你想限制MyClass只用类型创建从您的基类派生,您可以使用where (generic type constraint) (C# Reference)

public class MyClass<T> where T : YourBaseClass