通过混合ObservableSet使用a 创建了一个新类型HashSet,我有点期待替换然后能够使用新类型创建一个新实例,如下面的"foo".但是这不能编译,尽管使用该类型的原始长形式似乎很好(如下面的"条形图"所示).
这只是语言的一个特征还是我做了一些愚蠢的事情?
package whatever
import collection.mutable._
object Whatever {
type ObservableHashSet[T] = HashSet[T] with ObservableSet[T]
class X
def foo {
new ObservableHashSet[X]
}
def bar {
new HashSet[X] with ObservableSet[X]
}
}
Run Code Online (Sandbox Code Playgroud)
错误是......
error: class type required but scala.collection.mutable.HashSet[scala.Whatever.X] with scala.collection.mutable.ObservableSet[scala.Whatever.X] found
new ObservableHashSet[X]
Run Code Online (Sandbox Code Playgroud) 正如Eric Lippert的博客文章中所讨论的那样,关闭循环变量被认为是有害的,在C#中关闭循环变量会产生意想不到的后果.我试图理解是否将同样的"问题"应用于Scala.
首先,由于这是一个Scala问题,我将尝试解释Eric Lippert的C#示例,在他的代码中添加一些注释
// Create a list of integers
var values = new List<int>() { 100, 110, 120 };
// Create a mutable, empty list of functions that take no input and return an int
var funcs = new List<Func<int>>();
// For each integer in the list of integers we're trying
// to add a function to the list of functions
// that takes no input and returns that integer
// (actually that's not what …Run Code Online (Sandbox Code Playgroud) 我在c#中发现了一个行为,我想知道它是否在规范中(并且可以预期在所有平台和.NET运行时的新版本上工作),或者它是否是恰好可行的未定义行为但可能随时停止编译.
所以,假设我想采用现有的类,如下所示:
public class HtmlTextBox
{
public string Text {get; set;}
}
public class HtmlDiv
{
public string Text {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
现在我真的希望他们实现一个通用的IText接口,就像这样:
public interface IText
{
string Text {get; }
}
Run Code Online (Sandbox Code Playgroud)
但我无法直接更改类,因为它们是外部库的一部分.现在有各种方法可以通过继承或装饰器来实现.但我很惊讶地发现,简单地编译并在.NET 4.5(Windows 7 64位)上运行.
public class HtmlTextBox2 : HtmlTextBox, IText {}
public class HtmlDiv2 : HtmlDiv, IText {}
Run Code Online (Sandbox Code Playgroud)
而已.这让我可以直接替换HtmlTextBox并HtmlDiv使用他们现有的Text属性作为实现IText.
我一半期待编译器对我大吼大叫,要求我提供一个明确的重新实现Text,但是在.NET 4.5中,这只是起作用:
IText h2 = new HtmlTextBox2{Text="Hello World"};
Console.WriteLine(h2.Text); //OUTPUT: hello world
Run Code Online (Sandbox Code Playgroud)
事实上,我在单声道上尝试过相同的功能(无论ideone.com使用的是什么版本),单声道也不会对我大喊大叫
所以我想我很高兴,但在尝试使用严肃的代码之前,我想检查一下我是否误解了这里真正发生的事情,或者我是否不能依赖它来工作.
您可以使用if let模式匹配范围:
let n=1
if let 1...3 = n { println!("found in range") }
Run Code Online (Sandbox Code Playgroud)
但我不能让它适用于多种模式:
// this does not compile
if let 1 | 2 | 3 = n { println!("found in pattern") }
// -^ unexpected token
Run Code Online (Sandbox Code Playgroud)
我以为第二个if let去了:
// this does compile and work
match n {
1 | 2 | 3 => println!("found in pattern"),
_ => {}
}
Run Code Online (Sandbox Code Playgroud)
什么赋予了什么?我使用了错误的语法吗?我是否期望多种模式应该被误导?这只是没有实现?
在Entity Framework中,默认值约束功能尚未实现,我自己尝试了,然后在这里阅读它.所以,我想知道获得这个的最佳方法是什么.我应该使用存储过程还是触发类似的东西?并且在实体框架中添加了更好或更新的东西,因为我不想在代码中明确地处理它.这将是一个很大的帮助.
command.Parameters.Add("@EndDate", SqlDbType.DateTime).Value =
EndDate == null ?
(DateTime?)null :
DateTime.Parse(EndDate.ToShortDateString() + " " + EndTime);
Run Code Online (Sandbox Code Playgroud)
EndDate的类型是DateTime?和EndTime只是一个包含时间的字符串.但它在解析时给我错误,因为EndDate是可以为空的DateTime.我怎么解析这个?