扩展方法中的类型推断

问题描述:

我确定之前已经提出过这个问题,但是我细读了类似问题的搜索并没有得出答案。扩展方法中的类型推断

我厌倦了检查Nullable是否有值。为什么我不能将myNullable<int> yourAge分配到int myAge,如果yourAge为空,为什么不能分配一个异常?此外,如果我们任何一个该死的年龄都是空的,为什么我必须做一个fxning检查来避免给一个fxning SqlParameter分配'deafault'?我甚至不能做一个文明的mySqlParm = myAge.HasValue ? myAge.Value : DBNull.Value

可空类型的结点是什么?我们仍然必须使用'-1'作为pkId来避免可怕的Null。我们甚至无法添加我们自己的扩展方法,因为'blah blah'。

为什么即使fxning都打扰参数?为什么我们不把所有日期存储为fxning varchar(10)?

+2

哇,你生气 – 2009-08-26 20:11:10

+0

什么是你的问题? Nullable 与数据库有什么关系? – 2009-08-26 20:14:37

+1

也许“在扩展方法中进行类型推断”是什么启发你写这篇文章,但它不是这篇文章的正确标题。 – 2009-08-26 20:24:07

为什么我不能指定myNullable<int> yourAgeint myAge,并得到一个 异常,如果yourAge为空?

当然可以。只需使用Value属性而不首先检查:

int myAge = yourAge.Value; 

如果yourAge包含空值,您将得到一个异常。

+0

谢谢@Guffa,我从未想过,被其他复杂因素所蒙蔽。 – ProfK 2009-08-27 11:12:25

也许你想要做这样的事情?

public static object GetDatabaseValueFromNullableType<T>(this T? value) 
    where T: struct 
{ 
    return value.HasValue ? (object) value.Value : DBNull.Value; 
} 

,然后你可以使用它像这样:

//this is just a test I wrote but you get the idea 
[Test] 
public void NullableTest() 
{ 
    int? something = null; 
    var value = something.GetDatabaseValueFromNullableType(); 
    Assert.IsTrue(value == DBNull.Value); 
} 
+0

对于基于测试的示例。你应该得到赏金,但我只能在我的下一个问题上这样做。敬请关注。 :-) – ProfK 2009-08-27 11:14:04