Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中实现自己的数据类型而不使用枚举?_C#_C++_Types_Enums_Hard Coding - Fatal编程技术网

在C#中实现自己的数据类型而不使用枚举?

在C#中实现自己的数据类型而不使用枚举?,c#,c++,types,enums,hard-coding,C#,C++,Types,Enums,Hard Coding,内置数据类型和用户定义数据类型之间的主要区别在于:内置数据类型可以接受文本值(直接插入代码的值,这个过程也称为硬编码) 因此,是否可以创建与接受三个值的布尔值相同的自定义数据类型: 是/否/可能不使用枚举 例如以下代码: MyCustomBoolean a = maybe; 我问了以上问题,因为我想理解C语言中的内置数据类型是用核心语言(如C++ int、char…)或no?< /p>来指导的。 ---更新--- 关于第二个问题,让我提出一个问题,使第二个问题更加清楚: 我知道,例如strin

内置数据类型和用户定义数据类型之间的主要区别在于:内置数据类型可以接受文本值(直接插入代码的值,这个过程也称为硬编码)

因此,是否可以创建与接受三个值的布尔值相同的自定义数据类型: 是/否/可能不使用枚举

例如以下代码:

MyCustomBoolean a = maybe;

我问了以上问题,因为我想理解C语言中的内置数据类型是用核心语言(如C++ int、char…)或no?< /p>来指导的。 ---更新---

关于第二个问题,让我提出一个问题,使第二个问题更加清楚:


我知道,例如string是System.string的别名,但是C#中的纯string在没有System.string的情况下是否可以工作?

对于这种特殊情况,您可以使用一个可为null的bool。 典型操作如下:

bool? b = null
if (b.HasValue)
if (b.Value)
b = true

如果maybe为null,或者HasValue==false,则无法完全按照您的要求执行此操作。但是,您可以在C#中创建,它可以完成此结果(命名值),但只能使用或字符串,换句话说,就是您已经可以用于编译时常量的内容。否则,这可能特别有用

解决这个问题的一种方法是初始化静态字段或属性,尽管它不能用作真正的常量。比如说

public static readonly MyCustomBoolean Maybe { get { return new MycustomBoolean(); } }
public static MyCustomBoolean Maybe = new MyCustomBoolean();

文字是C语言的一个特征。不能创建新的文本

您可能对另一种编程语言(如Nemerle)感兴趣,该语言允许您创建用户定义的文本,如以下XML文本:

枚举和常量通常会填补C#的空白。对于更复杂的结构,您经常会看到使用了一些fluent API。


当然,我们可以看到C语言中缺少这一特性,这意味着为了提供一种自然的方式来定义查询,C语言规范需要修改以支持LINQ。如果C#具有与Nemerle类似的元编程特性,那么它们就可以在不更改语言语法的情况下实现与LINQ相同的目标。

您不能更改语言的语法(根据定义)。C#不支持用户定义的文本(C++支持,但只支持a)。但是,您仍然可以得到类似的代码,例如,通过定义一个名为
maybe
MyCustomBoolean
类型的变量,在C#中:不,不可能。虽然隐式转换运算符不会给您任何编译时安全性,但它更接近于隐式转换运算符。您需要一个类型来从任何其他现有类型转换。在您的示例中,
可能不是一种类型。这对编译器来说毫无意义。所以这是不允许的。@Cameron我知道例如string是System.string的别名,但是C中的纯string是否可以在没有System.string的情况下工作?@Cameron C++11还有
constepr
,它非常强大,似乎是OP想要的。作为一种解决方法,你可以使用一个可为空的布尔值(
bool?
),其中,
null
值表示可能。
但仅限于整数类型
否。您可以使用任何编译时文本,其中有一些非数字类型。非数字,是的,但我有意提到整数。为了清晰起见,我用一个链接更新了我的答案。我说这是错误的。对于不在该列表中的类型,有大量编译时文本。你的答案中甚至有一个正确的例子。正确的说法是,
const
标识符(注意,它实际上不是一个字段)可以初始化为任何编译时文本的值。好的,是的,显然字符串不算作“整数”,字符串也不是唯一的例外。如果您想了解C#中有效编译时文本的详细说明,请随意查看语言规范。这就是说,问题的关键在于如何定义他自己的编译时文本类型,以及那些还没有编译时文本的自定义类型。这并不能回答那个问题。是的!LINQ是一个很好的例子。但是LINQ在纯C代码中是如何做到这一点的呢?@Amir在使用LINQ时,没有使用编译时的文本。我看不出LINQ在这里有什么关系。@Servy请看下面的代码:int[]array={1,2,3,6,7,8};//查询表达式。var elements=从数组中的元素按元素降序,其中元素>2选择元素;它使用c#在核心语言中没有的单词。@阿米尔这些单词在核心语言中。它们是关键字,不是编译时常量值,但它们在实际的C语言规范中也被定义为上下文关键字。它们不是由LINQ定义的,甚至也不是特定于LINQ的。请随意查看C语言规范中的查询理解部分,自己阅读。
public static readonly MyCustomBoolean Maybe { get { return new MycustomBoolean(); } }
public static MyCustomBoolean Maybe = new MyCustomBoolean();