鉴于以下代码:
static void Main()
{
Console.WriteLine(typeof(MyEnum).BaseType.FullName);
}
enum MyEnum : ushort
{
One = 1,
Two = 2
}
Run Code Online (Sandbox Code Playgroud)
它输出System.Enum,这意味着这里的冒号与继承无关,它只是指定了枚举的基本类型,对不对?
但是,如果我更改我的代码如下:
enum MyEnum : UInt16
{
One = 1,
Two = 2
}
Run Code Online (Sandbox Code Playgroud)
我会得到一个编译错误.为什么?是不是UInt16和ushort一样吗?
我的特殊问题:
我有一个字符串,它在配置类中指定了aribitrary类型
Config.numberType = "System.Foo";
在哪里Foo是类型Decimal或Double
我Type.GetType(Config.numberType)用来返回相应的类型.
如何从该类型中获得能够使用System.Foo.TryParse()?
一些其他相关的查询
TryParse()可以从System.Foo.TryParse()以及访问foo.TryParse().这是否意味着fooC#中的某种类?这对我来说似乎很奇怪int,double等等实际上不仅仅是修饰符关键字.var似乎并非普遍可用,即仅在本地范围等.为什么C#.Net允许字符串对象的声明不区分大小写?
String sHello = "Hello";
string sHello = "Hello";
Run Code Online (Sandbox Code Playgroud)
单词String的小写和大写S都是可接受的,这似乎是允许这个的唯一对象.
有谁能解释为什么?
如果你深入了解C#中的值类型,那么编译器/ CLR会非常特别地对待它们.但是CLR内部的类型更加特殊.这就是我的意思:
int a = 5;
int b = 10;
int ? = a + b;
a.CompareTo(b);
Run Code Online (Sandbox Code Playgroud)
您可以将鼠标悬停int在Visual Studio中,看看它实际上是System.Int32struct.没关系.现在你可以抓住ILDasm并查看是什么System.Int32:转换它是一个非常简单的struct,有一个类型的字段int32(这是int32CLR的内部),并且没有重载的运算符用于添加.
那么,这int ? = a + b是如何工作的呢?我再次抓住ILDasm并研究IL.事实证明System.Int32IL代码中没有:编译器自动理解它应该替换它int32.并且IL指令add适用于int32堆栈中的几个.是什么使我感到有趣甚至更多,CLR允许呼叫实例方法System.Int32上int32.看起来像是一些黑魔法给我.
所以,这里是纯粹的理论问题:看起来System.Int32像任何其他的类型,它可以用C#以某种方式创建吗?如果可以,你可以用它做任何有用的事情(实际int32领域是私人的)吗?
编辑:好的,为了使它更清楚:这个问题没有关于int别名的问题System.Int32.一个可以提供例如,更换int与System.Int32和跳过例子后第一段.真正的问题是关于valuetype [mscorlib]System.Int32 a你的IL代码而不仅仅是的可能性int32 a.
可能重复:
C#,int还是Int32?我应该关心吗?
请任何人告诉我System.Int32的MSIL和int将是相同或不同的,如果不同,那么我们应该使用哪一个.
编辑:
这不会编译
public enum MyEnum : Int32
{
AEnum = 0
}
Run Code Online (Sandbox Code Playgroud)
但这会
public enum MyEnum : int
{
AEnum = 0
}
Run Code Online (Sandbox Code Playgroud) 可以像这样在C#中定义别名
using kvp = System.Collections.Generic.KeyValuePair<string, string>;
var pair = new kvp("key", "value");
Run Code Online (Sandbox Code Playgroud)
Microsoft也定义了别名:
int i;
Int32 i2;
Run Code Online (Sandbox Code Playgroud)
我们如何定义命名空间中可用的别名?这是可配置的吗?
这个问题具体是关于别名......所以......不希望使用继承作为代理.在很多情况下我很满意......但是当你想要最好的描述性名称和速记版本时,我都不满意.
在为我的程序编写 XML 文档时,我在记录此方法时遇到了一个问题:
internal void MethodB(int i, DateTime? date = null);
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是特定于参数的date。正如您所看到的,它是可选的并且可以为 null。以下是我尝试记录此方法的方法:
/// <summary>
/// This method uses <see cref="MethodB(Int32, System.DateTime)"/> internally
/// todo some stuff.
/// </summary>
Run Code Online (Sandbox Code Playgroud)
具体来说,我收到一条编译器警告,表明无法解析cref的值。
如何修复 XML 文档注释,使其在编译时不会出现此警告?
在C#中,内置类型的关键字只是System命名空间中相应类型的别名.
通常,使用关键字(例如int)或标识符(例如Int32)来引用内置类型没有区别.但是所有事情都有例外,所以我的问题分为两部分:
我对这门语言很新.这段代码给了我错误:
无法创建静态类'System.Tuple'的实例
Operator '!=' cannot be applied to operands of type 'bool' and 'int'
Run Code Online (Sandbox Code Playgroud)
我不知道我做错了什么.有人可以告诉我有什么问题
using(StreamReader rdr = new StreamReader("fileName"))
{
StringBuilder sb = new StringBuilder();
Int32 nc = 0;
Char c;
Int32 lineNumber = 0;
while( (nc == rdr.Read() !=-1 ))
{
c = (Char)nc;
if( Char.IsWhiteSpace(c) )
{
if( sb.Length > 0 )
{
yield return new Tuple( sb.ToString(), lineNumber );
sb.Length = 0;
}
if( c == '\n' ) lineNumber++;
}
else
{
sb.Append( c );
} …Run Code Online (Sandbox Code Playgroud)