C# 如何正确测试泛型定义的函数的参数是否为null

C# 如何正确测试泛型定义的函数的参数是否为null,c#,generics,C#,Generics,我有一个类,它接受这样的泛型: public class Foo<T> { public IActionResult MyClass(T id) { if (id == null) //do stuff else //do something else } } 公共类Foo{ 公共IActionResult MyClass(T id){ if(id==null) //做事 其他的 //做点别的 } } 我注意到,如果缺少参数,.NETCo

我有一个类,它接受这样的泛型:

public class Foo<T> {

  public IActionResult MyClass(T id) {
   if (id == null)
     //do stuff
   else
     //do something else
  }
}
公共类Foo{
公共IActionResult MyClass(T id){
if(id==null)
//做事
其他的
//做点别的
}
}
我注意到,如果缺少参数,.NETCore MVC会自动填充该参数。因此,如果有人用
newfoo
实例化我的类,我的参数
id
将永远不会等于null,而是等于
Guid.Empty

我想到了两种解决方案,但我不知道如何实现其中一种

  • 指定类型参数
    T
    必须是可为空的类型,如
    Guid?
    ,以便我可以使用
    if(id.HasValue)
    检查是否提供了id参数。这可能吗

  • 对照类型的默认值检查id。下面的代码未编译(错误消息显示“无法将运算符“==”应用于“TId”和“TId”类型的操作数)

  • if(id==null | | id==default(TId));


    实现这一点的最佳方法是什么?

    我最终使用的是:

    if (id == null || Object.Equals(id, default(TId)))
     //id was not supplied
    else 
     //id was supplied
    

    如果不将
    t
    限制为引用或值类型,则可以检查它是否为
    null
    或等于
    t
    的默认值:

    if (id != null && !id.Equals(default(T))
    

    Object.Equals(id,null)
    将编译。如果(id!=null&&!id.Equals)(默认值(T))为
    Guid?id=null;
    ,则返回true
    ?谢谢你mm8,我刚刚发现了同样的问题。如果你将同样的问题作为答案发布,我会选择正确的答案。请注意,这可能会导致有趣的惊喜。
    default(int)例如,
    0
    ,但是
    0
    当然是一个可以显式提供的整数值。我对MVC没有太多经验,但是如果可能的话,您的参数应该可以显式为空。谢谢。您的信息非常有效!幸运的是,对于我们的用例来说,这不会造成问题,但确实是你提出的合理担忧!