首页 > 解决方案 > 如何实现 Int32 的模拟?

问题描述

这个问题已经在严重的变化中被问到了。

基本上是:如何通过 C# 中的常量初始化结构?

答案是 - 在 c# 中是不可能的。

但是...我可以写

public class TModel2
{
    public const Int32 R32 = 32;
    public const Int32 R33 = 33;
}

[TestMethod]
public void TestMethod1()
{
    Int32 currentModel = TModel2.R33;
    switch (currentModel)
    {
        case TModel2.R32:
           break;
        case TModel2.R33:
           break;
    }
}

如果我检查 Int32 的来源,它被定义为结构。我可以轻松地重复 Int32 的代码并将其命名,例如 TModelItem。我只想写:

public class TModel1
{
    public const TModelItem R32 = 32;
    public const TModelItem R33 = 33;
}

[TestMethod]
public void TestMethod2()
{
    TModelItem currentModel = TModel1.R33;
    switch (currentModel)
    {
        case TModel1.R32:
            break;
        case TModel1.R33:
            break;
    }
}

但我无法让这个工作。是的,TModelItem 是重复的 Int32 并且代码甚至没有编译。

我如何使它工作?或者什么可以用来满足我的需求?我需要 int 或 long int 或 string 作为基础。

标签: c#structconstants

解决方案


就像已经提到的评论一样,这是不可能的。

我不知道这是否满足您的需求。但是你可以做的是这样的:

public readonly struct TModelItem
{
    public int Integer { get; }

    public TModelItem(int integer)
    {
        Integer = integer;
    }

    public static implicit operator TModelItem(int integer)
    {
        return new TModelItem(integer);
    }

    public static implicit operator int(TModelItem tModelItem)
    {
        return tModelItem.Integer;
    }
}
public class TModel1
{
    public static readonly TModelItem R32 = 32;
    public static readonly TModelItem R33 = 33;
}
[TestMethod]
public void TestMethod2()
{
    TModelItem currentModel = TModel1.R33;
    switch (currentModel)
    {
        case 32:
            break;
        case 33:
            break;
    }
}

推荐阅读