如何允许C#方法的泛型类型参数接受空参数?

如何允许C#方法的泛型类型参数接受空参数?,c#,generics,.net-4.0,C#,Generics,.net 4.0,实际上,上述问题是一个更大谜题的一部分。最终目标是让以下各项发挥作用 private static Matcher<object> EqualTo(object item) { return EqualTo<object>(item); } 应用了相同的修复RFC。(忽略丑陋的扩展方法部分-这是另一个问题。希望在所有测试夹具中都使用这些方法而不继承。) publicstaticvoid资产(此对象testFixture,对象实

实际上,上述问题是一个更大谜题的一部分。最终目标是让以下各项发挥作用

    private static Matcher<object> EqualTo(object item)
    {
        return EqualTo<object>(item);
    }  
应用了相同的修复RFC。(忽略丑陋的扩展方法部分-这是另一个问题。希望在所有测试夹具中都使用这些方法而不继承。)

publicstaticvoid资产(此对象testFixture,对象实际,匹配器匹配器,字符串消息=”)
{
资产(任何对象,(T)实际、匹配、消息);
}
公共静态void资产(此对象testFixture,T实际,Matcher Matcher,string message=“”),其中T:TSuper
{
…检查并断言

如果不显式指定T或执行强制转换,则不可能执行。泛型是编译时构造,因此,如果编译器在编译时无法确定类型,则它将无法编译(如您所见).

也许实现一个以对象为参数类型的非泛型EqualTo可以解决重写这些代码行的问题。

既然你不能准确地完成你想做的事情,那么定义一个
EqualTo(对象)怎么样
重载方法?这应该允许您使用所需的语法。

考虑以下方法:

public static void AssertThat<T>(this object testFixture, object actual, Matcher<T> matcher, string message = "")
{
  AssertThat(anyObject, (T)actual, matcher, message);
}

public static void AssertThat<T, TSuper>(this object testFixture, T actual, Matcher<TSuper> matcher, string message = "") where T : TSuper
{
  ... check and assert
或者显式地声明类型

EqualTo((object)null);
EqualTo(空)
或者定义一个重载

EqualTo<object>(null)
private static Matcher EqualTo(对象项){
返回新的等质量(项目);
}

您可以使用以下语法绕过此限制:

private static Matcher<object> EqualTo(object item) {
    return new IsEqual<object>(item);
}
default(T)
是类型为
T
的字段如果未设置的值。对于引用类型,它是
null
,对于值类型,它本质上是由零字节填充的内存(…对于不同的类型,它可能意味着不同的事情,但通常意味着零的某些版本)


我现在尽量避免代码中的任何地方出现
null
。这也会妨碍其他地方的类型推断,例如使用
var
声明字段和三元运算符。例如,
myArray==null?默认值(int?):myArray.Length
可以,但是
myArray==null?null:myArray.Length
不会编译。

您希望它如何从显式null值推断类型t?您当然可以在字符串变量中的null值上使用它,但我不知道有任何方法可以从显式null推断类型,而无需手动指定。嗯,您可以可能期望它推断出
对象
。以及
EqualTo(null)有什么问题
?我正试图找出实际问题。@Eamon-至少这似乎是一种允许人们创建bug的方式。我对
匹配器的签名了解不够,但我能想到一些事情,如果在没有警告的情况下更改结果的类型,这会破坏流畅风格的界面。@tvanfosson-实际上这正是我在特定场景中想要的-请参阅更新。@Eamon-感谢您在我的路上发送我。在发布其他答案时,我算出来了。:)最后一点正是我最终使用的。谢谢!
public bool IsNullString<T>(T item) {
    return typeof(T) == typeof(string) && item == null;
}
bool first = IsNullString<string>(null);
bool second = IsNullString<Foo>(null);

bool third = IsNullString(null);
EqualTo((object)null);
EqualTo<object>(null)
private static Matcher<object> EqualTo(object item) {
    return new IsEqual<object>(item);
}
EqualTo("abc");
EqualTo(4);
EqualTo(default(object));
//equivalently:
EqualTo((object)null);