Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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_Value Type_Reference Type - Fatal编程技术网

是否可以创建一个接受(可空)值类型和引用类型的C#泛型方法?

是否可以创建一个接受(可空)值类型和引用类型的C#泛型方法?,c#,.net,generics,value-type,reference-type,C#,.net,Generics,Value Type,Reference Type,我想创建一个简单的方法,它同时接受值类型和引用类型参数,即int是value,string是reference 这就是我首先要说的: public bool AreBothNotNull<T>(T? p1, T? p2) { return (p1.HasValue && p2.HasValue); } public bool AreBothNotNull(T?p1,T?p2) { 返回值(p1.HasValue&&p2.HasValue); } 所以我希望

我想创建一个简单的方法,它同时接受值类型和引用类型参数,即int是value,string是reference

这就是我首先要说的:

public bool AreBothNotNull<T>(T? p1, T? p2)
{
    return (p1.HasValue && p2.HasValue);
}
public bool AreBothNotNull(T?p1,T?p2)
{
返回值(p1.HasValue&&p2.HasValue);
}
所以我希望能够像这样使用它:

var r1 = AreBothNotNull<int>(3, 4); // will be true
var r2 = AreBothNotNull<int>(3, null); // will be false
var r3 = AreBothNotNull<string>("three", "four"); // will be true
var r4 = AreBothNotNull<string>(null, "four"); // will be false
var r1=AreBothNotNull(3,4);//这将是真的
var r2=AreBothNotNull(3,null);//将是错误的
var r3=AreBothNotNull(“三”、“四”);//这将是真的
var r4=AreBothNotNull(null,“四”);//将是错误的
但我遇到的第一个问题是

类型“T”必须是不可为null的值类型,才能在泛型类型或方法“System.nullable”中将其用作参数“T” 要继续,我向方法添加一个结构约束

public bool AreBothNotNull<T>(T? p1, T? p2) where T : struct
public bool AreBothNotNull(T?p1,T?p2),其中T:struct
但现在该方法不接受基于字符串的调用,并给出以下错误:

类型“string”必须是不可为null的值类型,才能将其用作泛型类型或方法中的参数“T”。
这可能吗?或者为什么我们不能这样做?

您的问题是您需要相互冲突的泛型类型约束:

  • Nullable
    仅适用于值类型
  • 引用类型不是值类型
因此,您需要有两个重载才能使代码正常工作:

public static bool AreBothNotNull<T>(T? p1, T? p2) where T : struct
{            
    return (p1.HasValue && p2.HasValue);
}

public static bool AreBothNotNull<T>(T p1, T p2)
{
    return (p1 != null && p2 != null);
}
公共静态bool AreBothNotNull(T?p1,T?p2),其中T:struct
{            
返回值(p1.HasValue&&p2.HasValue);
}
公共静态bool AreBothNotNull(tp1,tp2)
{
返回(p1!=null&&p2!=null);
}
但是,以下行永远不会编译:

var r3 = AreBothNotNull<string>(3, 4);
var r3=AreBothNotNull(3,4);

这里有一个冲突,泛型类型参数表示参数的类型为
string
,但代码试图传递
int
s。

这似乎是一件奇怪的事情,这并不奇怪,它只是有一种甜美的C++味道。我还将添加T:Stult和Ty:TimeTimes对方法的限制。抱歉它是R3的复制/粘贴错误,我将更新这个问题,“三”,“四”应该是参数。@萨拉:关于理解NulLable,我写了一篇关于这篇文章的博客文章: