为什么struct不能有无参数构造函数?为CLR做这件事有什么问题?为什么不允许这样做?请解释一下,因为我不明白.
以下声明:
type
TRec = record
constructor Create;
end;
Run Code Online (Sandbox Code Playgroud)
产生此编译错误:
E2394记录类型不允许使用无参数构造函数
该文档相当无益地说明:
没有更多信息可用于此错误或警告.
我的问题是为什么语言是这样设计的.这样做是否纯粹是为了回应C#结构的类似限制?
该语种导游这样说:
使用默认的无参数构造函数自动构造记录,但必须显式构造类.由于记录具有默认的无参数构造函数,因此任何用户定义的记录构造函数都必须具有一个或多个参数.
但这没有多大意义.如果记录有默认构造函数,则无法通过RTTI找到它.即使有,为什么这意味着不可能添加另一个呢?您可以为课程这样做.
也许理由是,如果允许我们定义自己的无参数构造函数,我们希望编译器自动调用它们.
注意:我知道您可以使用无参数静态类函数作为变通方法.实际上,我个人总是喜欢使用静态类函数而不是记录构造函数.但这不是问题的关键.我真正想知道的是为什么不允许在记录类型上使用无参数构造函数.
我正在用C#编写一个应用程序,它将进行大量计算.一切都围绕着基本的结构 - 价值.它基本上是一些额外的参数(精度等)的两倍.它必须是一个结构,因为将创建太多的它们来提供堆分配.现在,我需要确保它们都已正确初始化.我不能声明默认的显式构造函数,虽然我提供了默认构造函数,它使用0初始化所有内容,这在我的域中没有意义.
并且没有办法拒绝创建一个实例而不用参数调用我的构造函数...?
基本上我需要的是这个测试通过:
[Test]
public void HowDoesThisStructureInitializeByDefault()
{
Value v = new Value(); - if this did not compile - it would have been ok!
Assert.AreEqual(0, v.Val); - passes
Assert.AreEqual(-1, v.Accuracy); - fails
}
Run Code Online (Sandbox Code Playgroud)
如果没有显式调用构造函数并且仍然访问结构,则抛出异常是可以的,但是检查所有时间都需要花费太多时间.
我现在几乎失去了希望,请帮忙!
在C#中我们可以这样做:
Int32 i = new Int32();
Run Code Online (Sandbox Code Playgroud)
但是,以下内容将返回null:
typeof(Int32).GetConstructor(new Type[0])
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
我检查了文档,没有找到解决这个问题的原因.
我的结果可以在下面的代码中说明:
using System;
public class Program
{
public static void Main()
{
Int32 i = new Int32();
Console.WriteLine(i);
Console.WriteLine(typeof(Int32).GetConstructor(new Type[0]) == null);
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
0
真正
我想调用一个结构的构造函数,它具有所有参数的默认值。但是当我调用 MyRectangle 的无参数构造函数时,会调用一个未定义的构造函数。这是为什么?是否可以不调用 not 从我创建的构造函数?
using System;
namespace UebungClasses
{
class Program
{
static void Main(string[] args)
{
MyRectangle sixRec = new MyRectangle(3, 2);
MyRectangle oneRec = new MyRectangle();
Console.WriteLine("area of six: " + sixRec.Area() + " area of one: " + oneRec.Area());
}
}
public struct MyRectangle
{
public MyRectangle(double w = 1, double l = 1)
{
width = w;
length = l;
Console.WriteLine("Width: " + width + " Lenght: " + length);
}
public double Area()
{ …Run Code Online (Sandbox Code Playgroud) 我很惊讶我无法在结构中初始化我的字段,为什么会这样?喜欢:
struct MyStruct
{
private int a = 90;
}
Run Code Online (Sandbox Code Playgroud)
但这是一个complie时间错误.我不知道为什么这是一个问题?请向我解释一下.
如果我执行以下语句:
dim defaultDate as Date = Nothing
Run Code Online (Sandbox Code Playgroud)
defaultDate包含Date结构的默认值
我怀疑有一种干净的方式来检索这个值,就像某种buitin常数,但我无法找到它.
问:在VB.net中检索给定结构的默认值的干净方法是什么?
好的,我们听说struct不能有一个默认的无参数构造函数,这很好(http://stackoverflow.com/questions/333829/why-cant-i-define-a-default-constructor-for-a-struct-in-net ).但文档说"每个值类型都有一个隐式默认构造函数,用于初始化该类型的默认值." 来自http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx
现在隐式默认构造函数和无参数默认构造函数之间有什么区别?
struct vvvv
{
public int j = 8;
//public vvvv() { } error
}
class cccc
{
public int f = 8;
}
Run Code Online (Sandbox Code Playgroud)
在结构中,如果我注释掉构造函数,编译器会告诉我,j在指定显式构造函数之前,该字段不会被初始化,而在类的情况下,初始化程序将在隐式构造函数的主体运行之前完美运行。
我的意思是该结构还有一个隐式构造函数。为什么我必须指定一个显式的初始化程序才能运行?隐式构造函数还不够吗?
我有以下代码:
struct Person
{
public readonly int x;
public Person( int x )
{
this.x = x;
}
}
class Program
{
static void Main(string[] args)
{
Person p = new Person();
Console.Write(p.x);
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码运行良好。为什么?覆盖默认构造函数没有应用于 structs 吗?使用参数化构造函数是否覆盖默认构造函数?
假设我们有这两个结构......
public struct Example
{
public int Number { get; set; }
public Example(int Number)
{
Number = number;
}
}
Run Code Online (Sandbox Code Playgroud)
和:
public struct Example
{
public int Number { get; set; }
public Example(int number) : this()
{
Number = number;
}
}
Run Code Online (Sandbox Code Playgroud)
你可以看到有一个结构体,**this()**最后有一个构造函数,另一个没有。
两者有什么区别?
我在c ++中使用此代码来执行此操作,但我想在C#中执行相同的操作,但它无法正常工作,我无法弄明白为什么?
class Numero
{
public:
static int num;
Numero()
{
cout<<num++<<" ";
}
};
int Numero::num=1;
int main()
{
int n;
cout<<"Type n: ";
cin>>n;
Numero obj[n];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个印刷品"1 2 3 4 5 .... n"但在C#中
class numero
{
public static int num {get; set;}
public numero()
{
Console.WriteLine(num);
num++;
}
}
class Program
{
static void Main(string[] args)
{
numero.num=1;
Console.WriteLine("Type 'n'");
int n = int.Parse( Console.ReadLine());
Console.WriteLine("Printing to: {0}", n);
numero[] num_1 = new numero[n];
Console.WriteLine("End"); …Run Code Online (Sandbox Code Playgroud) struct TestStruct
{
static TestStruct()
{
Console.WriteLine("TestStruct");
}
}
Run Code Online (Sandbox Code Playgroud)
在结构中调用静态无参数构造函数时.
c# ×11
struct ×6
constructor ×2
.net ×1
c#-10.0 ×1
c++ ×1
delphi ×1
reflection ×1
value-type ×1
vb.net ×1