C# 为什么.NET Framework接受int datatable列中的字符串?

C# 为什么.NET Framework接受int datatable列中的字符串?,c#,C#,这里写着: “我们可以在为DataTable创建DataColumn时指定数据类型。这是为了强制该列的运行时类型安全性,以便只有指定数据类型的数据可以存储在该列中。同样,在大多数情况下,我们更喜欢将数据集本身设置为类型安全,以防止其运行时不匹配。因此,类型化数据ets生成的类以类型安全的方式公开数据集中的每个对象。这些类直接从数据集类继承。” 但这是可行的,而它不应该,因为我在typeof(int)id列中存储id.ToString()而不是id using System; using Syst

这里写着: “我们可以在为DataTable创建DataColumn时指定数据类型。这是为了强制该列的运行时类型安全性,以便只有指定数据类型的数据可以存储在该列中。同样,在大多数情况下,我们更喜欢将数据集本身设置为类型安全,以防止其运行时不匹配。因此,类型化数据ets生成的类以类型安全的方式公开数据集中的每个对象。这些类直接从数据集类继承。”

但这是可行的,而它不应该,因为我在typeof(int)id列中存储id.ToString()而不是id

using System;
using System.Data;

public class MyClass {

    public static void Main() {

        DataTable custTable = new DataTable("Customers");
        // add columns
        custTable.Columns.Add("id", typeof(int));
        custTable.Columns.Add("name", typeof(string));
        custTable.Columns.Add("address", typeof(string));

        // set PrimaryKey
        custTable.Columns[ "id" ].Unique = true;
        custTable.PrimaryKey = new DataColumn[] { custTable.Columns["id"] };

        // add ten rows
        for(int id=1; id<=10; id++)
        {
            custTable.Rows.Add(
                new object[] { id.ToString(), string.Format(
                "customer{0}", id.ToString()), string.Format("address{0}", id.ToString()) });
        }

        custTable.AcceptChanges();

        foreach (DataRow row in custTable.Rows) {
            Console.WriteLine("{0} {1}",row["id"],row["name"]);
        }
        Console.ReadLine();
    }   
}
使用系统;
使用系统数据;
公共类MyClass{
公共静态void Main(){
DataTable custTable=新的DataTable(“客户”);
//添加列
添加(“id”,typeof(int));
custable.Columns.Add(“name”,typeof(string));
custable.Columns.Add(“地址”,typeof(字符串));
//设置主密钥
custable.Columns[“id”].Unique=true;
custable.PrimaryKey=newdatacolumn[]{custable.Columns[“id”]};
//加十行

对于(int id=1;id,您的示例不属于编译器的职责范围。您创建了对象数组,所以这里没有任何错误


也许您会问,为什么数据库会将此字符串值接受为int值?可能是您的库将id.ToString识别为正确的整数,也可能是由数据库引擎完成的。因为在SQL级别上,所有字符串都转换为纯文本。您的示例不属于编译器的责任范围。您创建了对象数组,所以这里没有任何错误


也许您会问,为什么数据库会将此字符串值接受为int值?可能是库识别的id.ToString是正确的整数,也可能是由数据库引擎完成的。因为在SQL级别,所有字符串都转换为纯文本,因为编译器不知道DataTable类应该接受和不应该接受什么


rows集合的Add方法接受一组对象引用,因此可以向其中发送任何需要的数据类型。它尝试在运行时转换数据,如果您发送一些无法转换的数据,则会出现运行时错误。

,因为编译器不知道DataTable类应该和不应该接受什么。


rows集合的Add方法接受一组对象引用,因此可以将任何需要的数据类型发送到其中。它尝试在运行时转换数据,如果发送一些无法转换的数据,则会出现运行时错误。

DataTable类类似于字符串列名和对象值的查找表,类型为p编译器不使用您传递的参数。

DataTable类类似于字符串列名和对象值的查找表,编译器不使用您传递的类型参数。

您应该阅读链接到的文章的其余部分,而不仅仅是第一句话。您发布的代码创建了一个非类型化数据集。类型化数据集Set是用DataSet Designer创建的,事实上,它在编译时强制执行类型安全。在类型化数据集中,您将有一个
CustomerRow
类,该类公开了int
id
属性和string
name
address
属性,如果您试图将
id
设置为字符串值


实际上,ADO类会在运行时将值转换为适当的数据类型(如果可以的话)。因此,即使您的代码将
id
设置为字符串,实际存储在
DataRow
中的数据也是一个int-尝试将
id
设置为“a”您将得到一个运行时错误。这也是反过来的;如果您将
customer
设置为整数11,您将发现它实际上包含字符串“11”.

您应该阅读链接到的文章的其余部分,而不仅仅是第一句话。您发布的代码创建了一个非类型化数据集。类型化数据集是使用数据集设计器创建的,事实上,它在编译时强制执行类型安全。在类型化数据集中,您将有一个公开int
id
property和string
name
address
properties,如果试图将
id
设置为字符串值,则会出现编译时错误


实际上,ADO类会在运行时将值转换为适当的数据类型(如果可以的话)。因此,即使您的代码将
id
设置为字符串,实际存储在
DataRow
中的数据也是一个int-尝试将
id
设置为“a”您将得到一个运行时错误。这也是另一种情况;如果将
customer
设置为整数11,您将发现它实际上包含字符串“11”。

这是使用LINQ(特别是LINQ to SQL)的一大优势:编译器可以进行类型检查,这里的情况除外…..我不能使用LINQ to SQL,因为我使用Oracle和.NET 2。这是使用LINQ(特别是LINQ to SQL)的最大优势之一:编译器可以进行类型检查,这里的情况除外……我不能像使用Oracle和.NET 2那样使用LINQ to SQL。好吧,我重新格式化了,不是C#编译器而是ADO.NET Responsibility?肯定是ASP.NET以自动方式执行。好吧,我重新格式化了,不是C#编译器而是ADO.NET Responsibility?肯定是ASP.NET以自动方式执行方式。嗨,谢谢,我用“a”进行了测试,它生成了一个错误,这是我想要的,我只需要在运行时,我不在乎在设计时。嗨,谢谢,我用“a”进行了测试,它生成了一个错误,这是我想要的,我只需要在运行时,我不在乎在设计时。