Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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#_.net_Generics_Non Nullable - Fatal编程技术网

C# 泛型返回类型和不可为空的对象

C# 泛型返回类型和不可为空的对象,c#,.net,generics,non-nullable,C#,.net,Generics,Non Nullable,我有一个Sql实用程序类,其中包含许多围绕Sql查询的方便方法。 此类包含以下方法: public static T ExecuteScalar<T>( string query, SqlConnection connection, params SqlParameter[] parameters) where T : class, new() { SqlCommand command = CreateCommand(qu

我有一个Sql实用程序类,其中包含许多围绕Sql查询的方便方法。 此类包含以下方法:

public static T ExecuteScalar<T>(
    string query, 
    SqlConnection connection, 
    params SqlParameter[] parameters) 
    where T : class, new()
{
    SqlCommand command =
        CreateCommand(query, connection, parameters);

    return command.ExecuteScalar() as T;
}

由于此方法的约束返回类类型,因此可以返回与类类型(非基元)匹配的任何对象。但是,考虑到您方法的性质,我认为不需要约束。您应该能够删除此约束并返回可以生成的任何类型。

因为此方法的约束返回类类型,所以您可以返回与类类型(非基元)匹配的任何对象。但是,考虑到您方法的性质,我认为不需要约束。您应该能够删除此约束并返回可以生成的任何类型。

您可以使用
default(T)
(并且您应该删除泛型类型约束):

您可以使用
default(T)
(并且应该删除泛型类型约束):


不是你写的那样。如果强制转换失败,
as
运算符可能返回
null
,因此
T
必须为引用类型

对于值类型,需要使用传统的cast运算符
(T)
。您还需要删除
T
是方法定义上的引用类型的约束

public static T ExecuteScalar<T>(string query, 
                             SqlConnection connection, 
                             params SqlParameter[] parameters) 
{
    SqlCommand command = CreateCommand(query, connection, parameters);
    var result = command.ExecuteScalar();
    if (result is T) return (T)result;
    return default(T);
}
publicstatict ExecuteScalar(字符串查询,
SqlConnection连接,
参数SqlParameter[]参数)
{
SqlCommand=CreateCommand(查询、连接、参数);
var result=command.ExecuteScalar();
如果(结果为T)返回(T)结果;
返回默认值(T);
}

不是你写的方式。如果强制转换失败,
as
运算符可能返回
null
,因此
T
必须为引用类型

对于值类型,需要使用传统的cast运算符
(T)
。您还需要删除
T
是方法定义上的引用类型的约束

public static T ExecuteScalar<T>(string query, 
                             SqlConnection connection, 
                             params SqlParameter[] parameters) 
{
    SqlCommand command = CreateCommand(query, connection, parameters);
    var result = command.ExecuteScalar();
    if (result is T) return (T)result;
    return default(T);
}
publicstatict ExecuteScalar(字符串查询,
SqlConnection连接,
参数SqlParameter[]参数)
{
SqlCommand=CreateCommand(查询、连接、参数);
var result=command.ExecuteScalar();
如果(结果为T)返回(T)结果;
返回默认值(T);
}

您希望它如何将对象强制转换为Guid?原来是Guid吗?它是如何保存的?如果它只是ID列中的Guid字符串,请尝试
var Guid=new Guid(SqlUtils.ExecuteScalar(…)也许我在这里遗漏了什么,但我认为ExecuteScalar的目的是返回一个值。这意味着它永远不是一个复杂的类(假设您不将string和decimal计算为类)。这意味着它总是要返回int、guid、datetime等。ExecuteScalar要求T是类的意义何在。这使得ExecuteScalar方法毫无价值。唯一的情况是结果返回xml。XML可以序列化为一个类。T允许您将其适当地转换为字符串vs int,等等。否则它只能返回“object”,您希望它如何将对象转换为Guid?原来是Guid吗?它是如何保存的?如果它只是ID列中的Guid字符串,请尝试
var Guid=new Guid(SqlUtils.ExecuteScalar(…)也许我在这里遗漏了什么,但我认为ExecuteScalar的目的是返回一个值。这意味着它永远不是一个复杂的类(假设您不将string和decimal计算为类)。这意味着它总是要返回int、guid、datetime等。ExecuteScalar要求T是类的意义何在。这使得ExecuteScalar方法毫无价值。唯一的情况是结果返回xml。XML可以序列化为一个类。T允许您将其适当地转换为字符串vs int,等等。否则它只能返回“object”
public static T ExecuteScalar<T>(string query, 
                             SqlConnection connection, 
                             params SqlParameter[] parameters) 
{
    SqlCommand command = CreateCommand(query, connection, parameters);
    var result = command.ExecuteScalar();
    if (result is T) return (T)result;
    return default(T);
}