Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将接口实现约束到结构?_C#_Inheritance_Struct - Fatal编程技术网

C# 将接口实现约束到结构?

C# 将接口实现约束到结构?,c#,inheritance,struct,C#,Inheritance,Struct,C#中的接口可以继承另一个接口,例如 interface IFoo : IComparable { } 另一方面,以下声明是非法的: interface IBar : struct { } // Invalid syntax 是否有任何方法可以声明接口,从而将实现类型约束为结构?您不能声明结构的接口,因为类和结构只能实现接口。但您可以将带有泛型参数的接口声明为struct: interface IBar<T> where T : struct { void Foo(T v

C#中的接口可以继承另一个接口,例如

interface IFoo : IComparable { }
另一方面,以下声明是非法的:

interface IBar : struct { } // Invalid syntax

是否有任何方法可以声明接口,从而将实现类型约束为
结构

您不能声明结构的接口,因为类和结构只能实现接口。但您可以将带有泛型参数的接口声明为struct:

interface IBar<T> where T : struct
{
    void Foo(T val); // T always be struct
}
接口IBar,其中T:struct
{
void Foo(T val);//不总是结构
}
并实现此接口:

class Bar : IBar<int>
{
    public void Foo(int val) { }
}
类栏:IBar
{
公共void Foo(int val){}
}
是否有任何方法可以声明接口,从而将实现类型约束为结构

不,目前这是不可能的,反之亦然(确保接口由类实现)


就文档而言,我能找到的最接近的东西是这个。我怀疑官方MS站点上会有任何内容,因为(在大多数情况下)没有关于不存在的功能的文档(忽略功能请求或正在进行的功能),这可能被视为不存在的功能

我能找到的最近的

一个类或结构可以实现多个接口

实际上,多亏了用户@Evk的精彩评论,我意识到几乎可以将接口的实现限制为
struct
(或者类似地,限制为

接口可以实现为泛型接口,其中泛型类型参数被约束为实现接口本身的
struct

interface IBar<T> where T : struct, IBar<T> { }
但是,我不能以相同的方式声明实现IBar的
,因为泛型类型参数被限制为
结构

class BarClass : IBar<BarClass> { } // Will not compile!
class BarClass:IBar{}//将不会编译!
然而,这并不是一种防水的方法:正如user@Igor在下面的评论中指出的那样,以下内容仍将编译:

class BarClass : IBar<BarStruct> { }
class-BarClass:IBar{}

不支持仅通过structs实现接口。正确,此
接口IBar:class{}
。您不限制接口,但可以扩展它。这就是
interface-IFoo:IComparable
的含义,它指出
IFoo
扩展了
IComparable
接口(并不是说它仅限于
IComparable
),这听起来有点像XY问题,你想实现什么?在结构中实现接口通常是个坏主意。。。它几乎总是导致拳击。做这件事没问题,它会起作用的。。。但是你不应该,除非你知道你在做什么@我加了一个,但你不应该,除非你知道你在做什么。。。我希望微软的程序员都是“知道你在做什么”:-)这与OP的要求不同。本质上,他们希望通过对
IBar
的限制,将
Bar
强制为
struct
而不是
class
。是的,我完全知道这种可能性,但这不是我需要的。无论如何谢谢。可能更好:接口IBar,其中T:struct,IBar,因为句子是实现类型是ConstrainedTanks。如果你有一个指针,例如指向C#语言规范中的一个段落,我会非常乐意接受这个答案。@AndersGustafsson-好的,这是我能找到的最接近的答案。足够公平:-)感谢你的努力,Igor。尽管朝着正确的方向迈出了一步,但它不会阻止你编写
类BarClass:IBar{}
假设定义了
BarStruct
。是的,没错。也许我一时被迷住了:-)也许根本没有解决办法…虽然不是防水的,但也许它足够满足你的需要。不管怎样,我还是把它投了更高的票:谢谢!不幸的是,这并不完全是我所需要的,但是这是一个有趣的练习。@Evk:-)我已经解决了这个问题,所以现在不值得更详细地描述它。但谁知道呢,也许我会发布一个后续问题。。。
class BarClass : IBar<BarStruct> { }