private static Matcher<T> EqualTo<T>(T item)
{
return new IsEqual<T>(item);
}
如何修改上述方法定义,以使以下内容有效/å…许。
EqualTo("abc");
EqualTo(4);
EqualTo(null); // doesn't compile. EqualTo<string>(null) does
å°è¯•ç§»æ¤æŸäº›Java代ç ,null
似乎是T
å‚æ•°çš„å¯æŽ¥å—值。
æ›´æ–°
谢谢:所有ç”案 - 特别是Eamonå’ŒJason。我ä¸å¸Œæœ›æ–¹æ³•è°ƒç”¨æ‰“扰类型推æ–。以下é‡è½½ä¿®å¤äº†å®ƒã€‚
private static Matcher<object> EqualTo(object item)
{
return EqualTo<object>(item);
}
å®žé™…ä¸Šï¼Œä¸Šè¿°é—®é¢˜æ˜¯ä¸€ä¸ªæ›´å¤§éš¾é¢˜çš„ä¸€éƒ¨åˆ†ã€‚æœ€ç»ˆç›®æ ‡æ˜¯ä»¥ä¸‹å·¥ä½œã€‚
this.AssertThat(null, EqualTo(null));
this.AssertThat(null, Not(EqualTo("hi")));
this.AssertThat("hi", Not(EqualTo(null)));
应用相åŒçš„ä¿®å¤ç¨‹åº.. RFC 。 (忽略丑陋的扩展方法部分 - 这是å¦ä¸€ä¸ªé—®é¢˜ã€‚想è¦åœ¨æ²¡æœ‰ç»§æ‰¿çš„情况下在所有测试装置ä¸ä½¿ç”¨è¿™äº›æ–¹æ³•ã€‚)
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
ç”案 0 :(得分:11)
考虑以下方法:
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);
在第一个和第二个ä¸ï¼Œç¼–译器å¯ä»¥æ¸…楚地区分T
的类型(ä¸éœ€è¦æŽ¨æ–)。第三,编译器如何推æ–T
æ˜¯ä»€ä¹ˆï¼Ÿç‰¹åˆ«æ˜¯ï¼Œå®ƒæ— æ³•åŒºåˆ†T == string
å’ŒT == Foo
ï¼Œæˆ–ä»»ä½•å…¶ä»–ç±»åž‹ã€‚å› æ¤ï¼Œç¼–è¯‘å™¨å¿…é¡»ç»™ä½ ä¸€ä¸ªç¼–è¯‘æ—¶é”™è¯¯ã€‚
å¦‚æžœä½ æƒ³è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œä½ éœ€è¦æŠ•å°„null
EqualTo((object)null);
或明确说明类型
EqualTo<object>(null)
或定义é‡è½½
private static Matcher<object> EqualTo(object item) {
return new IsEqual<object>(item);
}
ç”案 1 :(得分:2)
如果没有明确指定T或进行强制转æ¢ï¼Œåˆ™æ— æ³•å®žçŽ°ã€‚æ³›åž‹æ˜¯ç¼–è¯‘æ—¶æž„é€ ï¼Œå› æ¤å¦‚æžœç¼–è¯‘å™¨æ— æ³•åœ¨ç¼–è¯‘æ—¶å¼„æ¸…æ¥šç±»åž‹ï¼Œé‚£ä¹ˆå®ƒå°†æ— æ³•ç¼–è¯‘ï¼ˆæ£å¦‚æ‚¨æ‰€çœ‹åˆ°çš„é‚£æ ·ï¼‰ã€‚
ç”案 2 :(得分:2)
ç”±äºŽæ‚¨æ— æ³•å®Œæˆæ‚¨æƒ³è¦åšçš„事情,如何定义EqualTo(object)
é‡è½½æ–¹æ³•ï¼Ÿè¿™åº”该å…许您需è¦çš„è¯æ³•ã€‚
ç”案 3 :(得分:2)
您å¯ä»¥ä½¿ç”¨ä»¥ä¸‹è¯æ³•è§£å†³æ¤é™åˆ¶ï¼š
EqualTo("abc");
EqualTo(4);
EqualTo(default(object));
//equivalently:
EqualTo((object)null);
default(T)
是T
类型å—段的值,如果未设置。对于引用类型,它是null
,对于值类型,它本质上是用零å—节填充的内å˜ï¼ˆ...对于ä¸åŒç±»åž‹å¯èƒ½æ„味ç€ä¸åŒçš„东西,但通常æ„味ç€æŸä¸ªç‰ˆæœ¬ä¸ºé›¶ï¼‰ã€‚
我现在å°è¯•é¿å…代ç ä¸åˆ°å¤„都是null
。它也阻ç¢äº†å…¶ä»–地方的类型推æ–,例如var
声明å—段和三元è¿ç®—符。例如,myArray==null ? default(int?) : myArray.Length
å¯ä»¥ï¼Œä½†myArray==null ? null : myArray.Length
å°†æ— æ³•ç¼–è¯‘ã€‚
ç”案 4 :(得分:0)
也许实现一个éžæ³›åž‹çš„EqualTo,它将Object作为å‚数类型,å¯ä»¥è§£å†³é‡å†™è¿™äº›ä»£ç 行的问题。