我有一个通用接口IDataAdapter<T>
;接口的实现者应该能够Guid
从数据源读取带有ID 的POCO 。IDataAdapter<T>
有一个Read(Guid id)
我想返回 a 的方法T?
,其中 null 表示在数据源中找不到匹配项。然而,即使约束T : notnull
上IDataAdapter<T>
,试图定义该方法给出了错误CS8627: A nullable type parameter must be known to be a value type or non-nullable reference type. Consider adding a 'class', 'struct', or type constraint.
为什么我仍然收到此错误,甚至T
限制到notnull
?
代码(应该在 C# 8 环境中<Nullable>enable</Nullable>
):
interface IDataAdapter<T> where T : notnull
{
T? Read (Guid id); // error CS8627
}
Run Code Online (Sandbox Code Playgroud) 我试图捕捉摩纳哥编辑每次击键时内容的价值。我尝试过使用编辑器的功能,但是当使用以下代码在操场onDidChangeModelContent()
上尝试时,这似乎不一致:
const editor = monaco.editor.create(document.getElementById("container"), {
value: "function hello() {\n\talert('Hello world!');\n}",
language: "javascript"
});
editor.onDidChangeModelContent = e => {
console.log(editor.getValue());
};
Run Code Online (Sandbox Code Playgroud)
我仅在使用选项卡自动完成智能感知建议时看到控制台条目,而不是在每次击键时看到控制台条目。我是否应该使用另一个事件侦听器,或者我应该尝试其他一些技术?
在启用了可空引用类型的C#8项目中,我有以下代码,我认为应该向我发出有关可能的空取消引用的警告,但不会:
public class ExampleClassMember
{
public int Value { get; }
}
public struct ExampleStruct
{
public ExampleClassMember Member { get; }
}
public class Program
{
public static void Main(string[] args)
{
var instance = new ExampleStruct();
Console.WriteLine(instance.Member.Value); // expected warning here about possible null dereference
}
}
Run Code Online (Sandbox Code Playgroud)
当instance
使用默认的构造函数初始化,instance.Member
设置为默认值ExampleClassMember
,这是null
。这样,instance.Member.Value
将NullReferenceException
在运行时抛出一个。据我了解C#8的可空性检测,我应该收到关于这种可能性的编译器警告,但我没有。这是为什么?
我正在尝试使用Foldable
Haskell 中的类型类,以以下数据类型为例:
data Tree a = Empty
| Node (Tree a) a (Tree a)
Run Code Online (Sandbox Code Playgroud)
如果我使用DeriveFoldable
GHC 扩展,它似乎Foldable
沿着
instance Foldable Tree where
foldMap _ Empty = mempty
foldMap f (Node l n r) = (foldMap f l) <> (f n) <> (foldMap f r)
Run Code Online (Sandbox Code Playgroud)
即,树的中序遍历。但是,我没有看到任何明显的阻止不同Foldable
实例的东西,例如预序遍历:
instance Foldable Tree where
foldMap _ Empty = mempty
foldMap f (Node l n r) = (f n) <> (foldMap f l) <> (foldMap f r)
Run Code Online (Sandbox Code Playgroud)
Foldable
类型类是否存在使预序遍历实例不合法的法律?
我正在尝试重新实现Haskell中列表数据类型的一些功能以用于学习目的.当我尝试:
使用此代码重新定义时:
{-# LANGUAGE NoImplicitPrelude #-}
data List a = Nil
| Cons a (List a)
(:) :: a -> List a -> List a
(:) = Cons
Run Code Online (Sandbox Code Playgroud)
我收到以下错误stack runghc
:
类型签名无效:(:) :: ...
应该是<variable> :: <type>形式
重新定义是不可能的:
?这就是我收到这个错误的原因吗?
在解决 Go 中编译时强制执行有效状态转换的问题时,我遇到了函数无法返回具有非具体类型参数的泛型类型的限制,如本问题所述。无法构建的 MRE(Go Playground 链接):
\ntype MyStruct[T any] struct {\n MyField T\n}\n\nfunc returnConstrainedGeneric[T any]() MyStruct[T] {\n return MyStruct[int]{\n MyField: 1,\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n编译器返回错误cannot use MyStruct[int]{\xe2\x80\xa6} (value of type MyStruct[int]) as MyStruct[T] value in return statement
。
链接的问题给出了这样的推理:
\n\n\n发生该错误的原因是涉及类型参数的操作(包括赋值和返回)必须对其类型集中的所有类型都有效。
\n
它概述了包括类型断言在内的几种解决方法,但我很好奇为什么会出现此限制。MyStruct[int]
天真地,在我的示例中,我希望从 中返回类型的值是有效的returnConstrainedGeneric()
,因为int
满足 的类型约束any
。我希望 的调用者returnConstrainedGeneric()
不知道返回值的类型是MyStruct[int]
,它只知道它MyStruct[T]
满足T
约束any
。我的推理中缺少什么?这是 Go 如何实现泛型/类型约束的基本问题,还是 Go 编译器当前实现的问题,还是其他问题?