首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在DLL中使用默认关键字

在DLL中使用默认关键字
EN

Stack Overflow用户
提问于 2014-11-06 01:29:37
回答 1查看 190关注 0票数 17

在DLL项目中使用default关键字时,我遇到了一个非常奇怪的问题。在我的DLL项目(用VS2013编译)中,我有以下类:

代码语言:javascript
复制
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;
    }
}

现在,如果我在DLL项目中使用它,它可以完美地工作。我可以毫无问题地创建从这个基类派生的类。但是,当我试图在另一个项目(用Mono 2.0.0编译)中使用DLL时,从具有值类型的基类派生会导致编译器错误。这一点:

代码语言:javascript
复制
public class ChildClass : BaseClass<int>
{
}

导致此问题的原因:

Assets/ChildClass.cs(8,14):错误CS1502: BaseClass.BaseClass(int,bool)的最佳重载方法匹配具有一些无效参数

Assets/ChildClass.cs(8,14):错误表达式:参数#1' cannot convertnull‘CS1503 to type’`int‘

但是,可以在字段中使用具有值类型的基类,这是没有问题的:

代码语言:javascript
复制
public class OtherClass
{
    public BaseClass<int> baseInt;
}

我使用ILSpy查看了动态链接库,并注意到:

代码语言:javascript
复制
public class BaseClass<T>
{
    public T value;
    public bool enabled;
    public BaseClass(T value = null, bool enabled = true)
    {
        this.value = value;
        this.enabled = enabled;
    }
}

请注意,构造函数中的default<T>已替换为null。这似乎是问题的原因,因为对于值类型来说,null可能是无效值。

那么这是怎么回事呢?

编辑:正如在评论中发现的,当第二个项目是用VS2013或更新版本的Mono编译时,不会发生这种情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-06 03:31:34

这似乎是mono编译器3.2.3之前版本的一个bug (@usr在他们最初的评论中是非常正确的)。编译器将默认参数值作为属性插入到程序集元数据中(请参见this answer)。我验证了ilspy的输出与将default(T)编码为.param [1] = nullref的ildasm一致。我怀疑惯例是泛型default(T)被编码为null,消费编译器应该知道如何使用它。它似乎与this issue有关,然而,根据日期,这个特定的问题在报告之前一段时间就被修复了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26763434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档