从C#结构继承是不可能的.这对我来说并不明白为什么会这样:
我想知道这是否是CLR中的技术限制,还是C#编译器阻止你做的事情?
编辑:值类型不能有虚拟方法,我意识到这个限制排除了大多数你想要使用继承的场景.但是,这仍然会留下继承 - 聚合.想象一个Shape
带有Colour
字段的结构:我可以编写接受任何结构派生的代码Shape
,并访问其Colour
字段,即使我永远不能编写虚Shape.Draw
方法.
我可以想到一个会被非密封值类型破坏的场景.值类型都应该落实Equals
和GetHashCode
正确; 即使这两个方法System.Object
都是虚拟的,它们也会在值类型上被非虚拟地称为.即使值类型没有被密封,编写从另一个派生的结构的人也无法编写自己的这两种方法的实现,并期望正确调用它们.
我应该指出,我并不是说我应该能够从我自己的代码中继承结构.但是,我想要做的是猜测为什么.NET禁止这种特殊代码气味.
编辑2:我刚刚发现了这个非常相似的问题,其答案实际上是"因为那时价值类型的数组不起作用".
Microsoft已解释说,他们不支持在Visual Studio 2010中的x64 CLR下编辑和继续:
在VS2010 for .NET 4.0中创建新的Visual C#控制台应用程序时,该项目的默认目标设置是以x86平台为目标而不是像Visual Studio 2008那样的任何CPU(MSIL)
[...]
不幸的是,为64位CLR添加了对EnC的真正支持,考虑到将平台目标更改为x86的工作,大型工作项和其他功能优先于此.
(来自http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=455103)
Microsoft Connect上的描述使得64位Edit and Continue看起来好像是一个重大的体系结构更改.我的问题是:x64有什么不同让EnC变得困难?
除了"64位EnC不起作用"之外,我在网络上的技术细节方式上找不到太多东西.
我想从相对URI中提取查询字符串和片段,即没有任何方案或主机信息的URI.
有没有更优雅的方法来做到这一点,而不是把它变成一个假的主机名的绝对URI?
var relativeUri = "/dir1/dir2/file?a=b&c=d#fragment";
var uri = new Uri(new Uri("http://example.com"), relativeUri);
var path = Uri.UnescapeDataString(String.Concat(uri.Segments));
var query = uri.Query;
var fragment = uri.Fragment;
// path = "/dir1/dir2/file", query = "?a=b&c=d", fragment = "#fragment"
Run Code Online (Sandbox Code Playgroud) F#允许您通过以下方式将运算符转换为函数(
)
:例如,(+)
类型int -> int -> int
.
是否可以使用list cons运算符执行此操作::
?
它的行为不像普通的二元运算符:
FSI> (::);;
(::);;
-^^
c:\temp\stdin(3,2): error FS0010: Unexpected symbol '::' in expression.
Expected ')' or other token.
Run Code Online (Sandbox Code Playgroud)
并且该List.Cons
方法需要一个元组; 它并非咖喱.
(能够做到这一点很有用.例如,你可以用它来实现折叠方面的地图).
是否可以组合一个计算表达式构建器,它可以对两个或多个表达式进行排序而不必放在do!
每个表达式的前面?
如果我已正确阅读本手册的相关部分,则应通过构建器的Combine
方法实现.但是,我的Combine
方法似乎没有被使用; 相反,我得到一个编译器警告,建议我用它ignore
来丢弃结果.
例如,给定一个F#状态monad,我希望能够这样做:
let hello who = State (fun lines -> lines @ [sprintf "hello %s" who])
let m = state {
hello "world"
hello "F#"
}
let l = Execute m []
// l should now contain ["hello world"; "hello F#"]
Run Code Online (Sandbox Code Playgroud) 我的网站用完了Couch数据库实例,因此我将vhost配置为指向/dbname/_design/app/_rewrite
.
我希望能够从Web浏览器访问索引页面,同时仍然通过Ajax访问Couch DB API,所以我在我的rewrites
字段中设置了一对重写规则:
[ { "from": "/dbname/*", "to: ../../*" },
{ "from": "/*", "to: *" } ]
Run Code Online (Sandbox Code Playgroud)
这些规则运行正常:我可以通过/dbname/docname
URL 访问单个文档,我可以将我的Web浏览器指向站点的根目录并以这种方式访问我的附件.
我现在想要访问数据库本身的信息,以便将since
参数传递给_changes
API.
/dbname/
工作良好/dbname/?name=value
没有正确重定向.在Couch DB日志中,我看到了类似的行'GET' /dbname/_design/..?name=value 404
,而我希望看到'GET' /dbname/?name=value 200
.第二种情况是来自IE的Ajax,其中jquery.couch.js
代码添加了一个伪查询字符串以避免缓存.
如何判断我的重写规则以便Couch DB /dbname/?name=value
正确重写?
编辑:为了澄清,只要在URL中的最后一个/之后存在某些内容,查询字符串就可以正常工作.
/dbname/docname?rev=xxx
作品/dbname/_changes?since=1
作品/dbname/?_=dummy
不起作用; 它重写为/dbname/_design/..?_=dummy
有没有办法使下面的代码工作?也就是说,在类型别名下导出枚举,并允许以新名称访问变体?
enum One { A, B, C }
type Two = One;
fn main() {
// error: no associated item named `B` found for type `One` in the current scope
let b = Two::B;
}
Run Code Online (Sandbox Code Playgroud) 我正在编写处理来自Language.Exts.Annotated.Syntax的值的代码,其中定义了各种类型的镜像Haskell模块的结构:
data Module l = ...
data Decl l = ...
data Exp t = ...
-- etc
Run Code Online (Sandbox Code Playgroud)
我希望能够编写处理这些数据结构并对它们执行各种转换的函数.因为没有一种常见的数据类型,所以我无法编写一个可以完成所有操作的函数.
到目前为止,我已经编写了一个Tree
包装这些类型的类型,以便我的转换函数可以执行Tree l -> Tree l
:
data Tree l = ModuleT (Module l)
| DeclT (Decl l)
| ExpT (Exp l)
-- etc copy & paste
Run Code Online (Sandbox Code Playgroud)
但是我现在发现自己编写了很多代码,需要Module
包含它ModuleT
,包装它,调用函数,然后再将结果重新打包Module
.我有:
class AnnotatedTree ast where
tree :: ast l -> Tree l
untree :: Tree l -> ast l
instance AnnotatedTree Module where
tree …
Run Code Online (Sandbox Code Playgroud) 我们有一个TeamCity实例,其中包含各种项目和构建配置,目前尚未设置安全性.虽然大多数项目都可以公开显示,但我们想设置几个只对某些用户可见的项目.
因为有已经被设置在服务器上很多公益项目,在各种球队,我们希望避免设立的一切限制 - 也就是我们宁愿使用"拒绝访问项目Z"不是"允许访问项目A,允许访问项目B,...,允许访问项目Y".
如何在不影响公共项目的情况下限制对这些项目的访问?
我有一系列任务,每个任务取决于前一个任务的输出.我想将它表示为单个Task
对象,其结果是序列末尾的输出.(如果任务不依赖于彼此,那么我可以并行执行,我会使用TaskFactory.ContinueWhenAll
.)
我希望能够实现这个方法:
static Task<TState> AggregateAsync<T, TState>(
IEnumerable<T> items,
TState initial,
Func<TState, T, Task<TState>> makeTask);
Run Code Online (Sandbox Code Playgroud)
我怎样才能有效地依次运行任务呢?我正在使用C#4.0,所以我无法使用async
/ await
为我做这件事.
编辑:我可以AggregateAsync
像这样写:
static Task<TState> AggregateAsync<T, TState>(IEnumerable<T> items, TState initial, Func<TState, T, Task<TState>> makeTask)
{
var initialTask = Task.Factory.StartNew(() => initial);
return items.Aggregate(
initialTask,
(prevTask, item) =>
{
prevTask.Wait(); // synchronous blocking here?
return makeTask(prevTask.Result, item);
});
}
Run Code Online (Sandbox Code Playgroud)
但是我肯定会得到一批任务,每个任务同步等待前面的那个任务?