default在DLL项目中使用关键字时,我遇到了一个非常奇怪的问题.在我的DLL项目(使用VS2013编译)中,我有以下类:
public class BaseClass<T>
{
public T value;
public bool enabled;
public BaseClass ( T value = default(T), bool enabled = true )
{
this.value = value;
this.enabled = enabled;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我在DLL项目中使用它,它可以很好地工作.我可以创建从这个基类派生的类而不会出现问题.但是,只要我尝试在另一个项目中使用DLL(使用Mono 2.0.0编译),从基类派生值类型会导致编译器错误.这个:
public class ChildClass : BaseClass<int>
{
}
Run Code Online (Sandbox Code Playgroud)
导致这个:
Assets/ChildClass.cs(8,14):错误CS1502:BaseClass <int> .BaseClass(int,bool)'的最佳重载方法匹配有一些无效的参数
Assets/ChildClass.cs(8,14):错误CS1503:参数
#1' cannot convertnull'表达式为'int'类型
但是,具有值类型的基类可以在没有问题的字段中使用:
public class OtherClass
{
public BaseClass<int> baseInt;
}
Run Code Online (Sandbox Code Playgroud)
我使用ILSpy查看了DLL并注意到了这一点:
public class BaseClass<T>
{
public T value;
public bool enabled;
public BaseClass(T value = null, bool enabled = true)
{
this.value = value;
this.enabled = enabled;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,default<T>在构造函数中已替换为null.这似乎是问题的原因,因为null将是值类型的无效值.
那么这里发生了什么?
编辑:正如在评论中发现的那样,当使用VS2013或更新版本的Mono编译第二个项目时,不会发生这种情况.
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |