小编Tim*_*son的帖子

为什么.NET值类型被密封?

从C#结构继承是不可能的.这对我来说并不明白为什么会这样:

  • 显然,您不能拥有从值类型继承的引用类型; 这不行
  • 从一个原始类型(Int32,Double,Char等)继承它听起来是不合理的.
  • 您需要能够使用派生实例在基础上调用(非虚拟)方法.您可以从派生结构转换为基础,因为它们将重叠相同的内存.我想从基础到派生的转换是行不通的,因为你无法在运行时知道派生结构的类型.
  • 我可以看到您无法在类层次结构中实现虚方法,因为值类型不能包含虚拟成员

我想知道这是否是CLR中的技术限制,还是C#编译器阻止你做的事情?

编辑:值类型不能有虚拟方法,我意识到这个限制排除了大多数你想要使用继承的场景.但是,这仍然会留下继承 - 聚合.想象一个Shape带有Colour字段的结构:我可以编写接受任何结构派生的代码Shape,并访问其Colour字段,即使我永远不能编写虚Shape.Draw方法.

我可以想到一个会被非密封值类型破坏的场景.值类型都应该落实EqualsGetHashCode正确; 即使这两个方法System.Object都是虚拟的,它们也会在值类型上被非虚拟地称为.即使值类型没有被密封,编写从另一个派生的结构的人也无法编写自己的这两种方法的实现,并期望正确调用它们.

我应该指出,我并不是说我应该能够从我自己的代码中继承结构.但是,我想要做的是猜测为什么.NET禁止这种特殊代码气味.

编辑2:我刚刚发现了这个非常相似的问题,其答案实际上是"因为那时价值类型的数组不起作用".

.net c# struct

38
推荐指数
2
解决办法
6984
查看次数

为什么不编辑和继续在x64 CLR上工作?

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不起作用"之外,我在网络上的技术细节方式上找不到太多东西.

.net 64-bit

33
推荐指数
1
解决办法
8218
查看次数

解析相对URI

我想从相对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)

.net uri

23
推荐指数
2
解决办法
7225
查看次数

使用list cons运算符(a :: b)作为函数

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方法需要一个元组; 它并非咖喱.

(能够做到这一点很有用.例如,你可以用它来实现折叠方面的地图).

f# function operator-keyword

17
推荐指数
3
解决办法
2692
查看次数

省略'做!' 在计算表达式中

是否可以组合一个计算表达式构建器,它可以对两个或多个表达式进行排序而不必放在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)

f#

13
推荐指数
2
解决办法
611
查看次数

通过重写的URL访问Couch DB数据库URL,并使用查询参数

我的网站用完了Couch数据库实例,因此我将vhost配置为指向/dbname/_design/app/_rewrite.

我希望能够从Web浏览器访问索引页面,同时仍然通过Ajax访问Couch DB API,所以我在我的rewrites字段中设置了一对重写规则:

[ { "from": "/dbname/*", "to: ../../*" },
  { "from": "/*", "to: *" } ]
Run Code Online (Sandbox Code Playgroud)

这些规则运行正常:我可以通过/dbname/docnameURL 访问单个文档,我可以将我的Web浏览器指向站点的根目录并以这种方式访问​​我的附件.

我现在想要访问数据库本身的信息,以便将since参数传递给_changesAPI.

  1. /dbname/ 工作良好
  2. /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

couchdb

12
推荐指数
1
解决办法
4057
查看次数

为枚举键入别名

有没有办法使下面的代码工作?也就是说,在类型别名下导出枚举,并允许以新名称访问变体?

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)

rust

12
推荐指数
1
解决办法
1139
查看次数

在处理许多不相关的类型时避免样板

我正在编写处理来自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)

haskell generic-programming

9
推荐指数
1
解决办法
276
查看次数

限制对某些TeamCity项目的访问

我们有一个TeamCity实例,其中包含各种项目和构建配置,目前尚未设置安全性.虽然大多数项目都可以公开显示,但我们想设置几个只对某些用户可见的项目.

因为有已经被设置在服务器上很多公益项目,在各种球队,我们希望避免设立的一切限制 - 也就是我们宁愿使用"拒绝访问项目Z"不是"允许访问项目A,允许访问项目B,...,允许访问项目Y".

如何在不影响公共项目的情况下限制对这些项目的访问?

teamcity teamcity-7.0

8
推荐指数
1
解决办法
5979
查看次数

一个接一个地运行任务序列

我有一系列任务,每个任务取决于前一个任务的输出.我想将它表示为单个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)

但是我肯定会得到一批任务,每个任务同步等待前面的那个任务?

.net c# asynchronous c#-4.0

7
推荐指数
1
解决办法
1万
查看次数