说我有以下课程:
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
时?
答案 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