代码改变世界

Linq to Sql中使用自定义枚举类型的奇怪问题

2008-09-08 14:53  JimLiu  阅读(1563)  评论(0)    收藏  举报

我声明了一个自定义枚举类型MyNamespace.Model.Result

public enum Result : int {
    Waiting 
= 0,
    Accepted 
= 1
}

数据库中有一列是int叫Result

在dbml设计器中我自然而然地把Result这个属性的类型设置为MyNamespace.Model.Result

生成了如下代码

[Column(Storage="_Result", DbType="Int NOT NULL", CanBeNull=false)]
public MyNamespace.Model.Result Result
{
    
get
    {
        
return this._Result;
    }
    
set
    {
        
if ((this._Result != value))
        {
            
this.OnResultChanging(value);this.SendPropertyChanging();
            
this._Result = value;
            
this.SendPropertyChanged("Result");
            
this.OnResultChanged();
        }
    }
}

很好,正合我意。

编译——错了……说类型转换不受支持!

我晕了……我在NHibernate就这样用啊,一点问题都没的。

没辙之下我玩起无聊来,把Result属性的类型设置为Result,结果竟然编译通过了!

这真是太诡异了,MyNamespace.Model.Result这个限定名怎么也不会比Result这个限定名要弱啊,为什么编译不能通过呢?

尝试之下我发现更神奇的问题,就是用Model.Result这个限定名是可以编译通过的。

映射的类Submit是处于MyNamespace.Model命名空间下的,也就是说它的完整限定名是MyNamespace.Model.Submit。这样来说在它的任何一个成员函数或者属性访问器的作用域下,MyNamespace.Model.Result, Model.Result, Result这三个限定名都是可以正确访问到我的自定义枚举类型的,不会有问题啊。这就如同我们在System.Web.UI.Page的派生类中访问System.Web.UI.Control,我们即可以简单地用Control,也可以用System.Web.UI.Control这个完整的名字,而且后者更强,因为可能命名存在二义性——命名空间存在的意义和设计的初衷不就是为了避免命名冲突吗?可是为什么在这里强的反而不行,得弱的才行呢?

这个问题真是弄得我晕头转向啊,看来我C#基础有问题吧?