using `is` operator with value type tuples gives errorC# 7 Pattern Match with a tupleHow do you give a C# Auto-Property a default value?Direct casting vs 'as' operator?Collection was modified; enumeration operation may not executeGet int value from enum in C#How to loop through all enum values in C#?Type Checking: typeof, GetType, or is?Extension methods defined on value types cannot be used to create delegates - Why not?Overriding == operator. How to compare to null?How do I populate current class with new class values?Why `as` is giving null for nullable value types?

How to draw pentagram-like shape in Latex?

Can an airline pilot be prosecuted for killing an unruly passenger who could not be physically restrained?

When did Britain learn about the American Declaration of Independence?

Physically unpleasant work environment

What do you call bracelets you wear around the legs?

Is my homebrew Awakened Bear race balanced?

How come Arya Stark wasn't hurt by this in Game of Thrones Season 8 Episode 5?

Does the usage of mathematical symbols work differently in books than in theses?

Would a "ring language" be possible?

Who is frowning in the sentence "Daisy looked at Tom frowning"?

pwaS eht tirsf dna tasl setterl fo hace dorw

How to customize the pie chart background in PowerPoint?

How does this piece of code determine array size without using sizeof( )?

Was Tyrion always a poor strategist?

Should all adjustments be random effects in a mixed linear effect?

how to create an executable file for an AppleScript?

Working hours and productivity expectations for game artists and programmers

Why is the S-duct intake on the Tu-154 uniquely oblong?

Taylor series leads to two different functions - why?

How do you cope with rejection?

Why use a retrograde orbit?

Why is Drogon so much better in battle than Rhaegal and Viserion?

What color to choose as "danger" if the main color of my app is red

How to get all possible paths in 0/1 matrix better way?



using `is` operator with value type tuples gives error


C# 7 Pattern Match with a tupleHow do you give a C# Auto-Property a default value?Direct casting vs 'as' operator?Collection was modified; enumeration operation may not executeGet int value from enum in C#How to loop through all enum values in C#?Type Checking: typeof, GetType, or is?Extension methods defined on value types cannot be used to create delegates - Why not?Overriding == operator. How to compare to null?How do I populate current class with new class values?Why `as` is giving null for nullable value types?






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








18















I am trying to check if an object variable is (int, int) and if so I will use the casted variable so I have tried the codes below:



//this one gives error
public void MyMethodWithIs(object val)

if(val is (int id, int name) pair)

ConsoleWriteLine($"pair.id, pair.name");



//This one works
public void MyMethodWithAs(object val)

var pair = val as (int id, int name)?;
if(pair!=null)

ConsoleWriteLine($"pair.id, pair.name");




The MyMethodWithIs method gives the error below in the editor:




No suitable deconstruct instance or extension method was found for type




My Question



Why one works fine but the other gives an error at all? I think MyMethodWithIs more readable and suitable to use for my case but I can't use it due to giving an error.










share|improve this question
























  • AFAIK value tuples don't store item name information, so there is probably no way to check if the items are id and name. I am guessing it might work without names if (val is (int, int) pair)

    – Slai
    May 12 at 20:31












  • @Slai I also tried it, but the same error appears.

    – ilkerkaran
    May 12 at 20:32






  • 4





    if (val is ValueTuple<int,string> pair) works though. Somewhat related: stackoverflow.com/questions/44706498/…

    – György Kőszeg
    May 12 at 20:39


















18















I am trying to check if an object variable is (int, int) and if so I will use the casted variable so I have tried the codes below:



//this one gives error
public void MyMethodWithIs(object val)

if(val is (int id, int name) pair)

ConsoleWriteLine($"pair.id, pair.name");



//This one works
public void MyMethodWithAs(object val)

var pair = val as (int id, int name)?;
if(pair!=null)

ConsoleWriteLine($"pair.id, pair.name");




The MyMethodWithIs method gives the error below in the editor:




No suitable deconstruct instance or extension method was found for type




My Question



Why one works fine but the other gives an error at all? I think MyMethodWithIs more readable and suitable to use for my case but I can't use it due to giving an error.










share|improve this question
























  • AFAIK value tuples don't store item name information, so there is probably no way to check if the items are id and name. I am guessing it might work without names if (val is (int, int) pair)

    – Slai
    May 12 at 20:31












  • @Slai I also tried it, but the same error appears.

    – ilkerkaran
    May 12 at 20:32






  • 4





    if (val is ValueTuple<int,string> pair) works though. Somewhat related: stackoverflow.com/questions/44706498/…

    – György Kőszeg
    May 12 at 20:39














18












18








18


1






I am trying to check if an object variable is (int, int) and if so I will use the casted variable so I have tried the codes below:



//this one gives error
public void MyMethodWithIs(object val)

if(val is (int id, int name) pair)

ConsoleWriteLine($"pair.id, pair.name");



//This one works
public void MyMethodWithAs(object val)

var pair = val as (int id, int name)?;
if(pair!=null)

ConsoleWriteLine($"pair.id, pair.name");




The MyMethodWithIs method gives the error below in the editor:




No suitable deconstruct instance or extension method was found for type




My Question



Why one works fine but the other gives an error at all? I think MyMethodWithIs more readable and suitable to use for my case but I can't use it due to giving an error.










share|improve this question
















I am trying to check if an object variable is (int, int) and if so I will use the casted variable so I have tried the codes below:



//this one gives error
public void MyMethodWithIs(object val)

if(val is (int id, int name) pair)

ConsoleWriteLine($"pair.id, pair.name");



//This one works
public void MyMethodWithAs(object val)

var pair = val as (int id, int name)?;
if(pair!=null)

ConsoleWriteLine($"pair.id, pair.name");




The MyMethodWithIs method gives the error below in the editor:




No suitable deconstruct instance or extension method was found for type




My Question



Why one works fine but the other gives an error at all? I think MyMethodWithIs more readable and suitable to use for my case but I can't use it due to giving an error.







c# valuetuple






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited May 13 at 6:45







ilkerkaran

















asked May 12 at 20:22









ilkerkaranilkerkaran

1,3531225




1,3531225












  • AFAIK value tuples don't store item name information, so there is probably no way to check if the items are id and name. I am guessing it might work without names if (val is (int, int) pair)

    – Slai
    May 12 at 20:31












  • @Slai I also tried it, but the same error appears.

    – ilkerkaran
    May 12 at 20:32






  • 4





    if (val is ValueTuple<int,string> pair) works though. Somewhat related: stackoverflow.com/questions/44706498/…

    – György Kőszeg
    May 12 at 20:39


















  • AFAIK value tuples don't store item name information, so there is probably no way to check if the items are id and name. I am guessing it might work without names if (val is (int, int) pair)

    – Slai
    May 12 at 20:31












  • @Slai I also tried it, but the same error appears.

    – ilkerkaran
    May 12 at 20:32






  • 4





    if (val is ValueTuple<int,string> pair) works though. Somewhat related: stackoverflow.com/questions/44706498/…

    – György Kőszeg
    May 12 at 20:39

















AFAIK value tuples don't store item name information, so there is probably no way to check if the items are id and name. I am guessing it might work without names if (val is (int, int) pair)

– Slai
May 12 at 20:31






AFAIK value tuples don't store item name information, so there is probably no way to check if the items are id and name. I am guessing it might work without names if (val is (int, int) pair)

– Slai
May 12 at 20:31














@Slai I also tried it, but the same error appears.

– ilkerkaran
May 12 at 20:32





@Slai I also tried it, but the same error appears.

– ilkerkaran
May 12 at 20:32




4




4





if (val is ValueTuple<int,string> pair) works though. Somewhat related: stackoverflow.com/questions/44706498/…

– György Kőszeg
May 12 at 20:39






if (val is ValueTuple<int,string> pair) works though. Somewhat related: stackoverflow.com/questions/44706498/…

– György Kőszeg
May 12 at 20:39













1 Answer
1






active

oldest

votes


















17














Using C# 8's pattern matching capabilities, you can write this:



if (val is (int id, int name))

Console.WriteLine($"id: id; name: name");



However this boxes id and name, which is surprising. There's a proposal to optimize this.



Below C# 8, you can write this:



if (val is ValueTuple<int, int> pair)

Console.WriteLine($"id: pair.Item1; name: pair.Item2");



You can of course make it a bit clearer:



if (val is ValueTuple<int, int> pair)

var (id, name) = pair;
Console.WriteLine($"id: id; name: name");



It looks like you can also deconstruct the ValueTuple inline:



if (val is ValueTuple<int, int>(var id, var name))

Console.WriteLine($"id: id; name: name");



... which is somewhat horrific, but appears to be legal.



I might have expected val is (int, int) pair) to work, but it seems nobody's designed this case (yet).






share|improve this answer




















  • 1





    The first code block gives the same error. The second one works but I don't want to use Item1, Item2 etc.

    – ilkerkaran
    May 12 at 20:45











  • @ilkerkaran It works in sharplab - might be new in C# 8. sharplab.io/…

    – canton7
    May 12 at 20:47











  • @ilkerkaran found another way, added to my answer

    – canton7
    May 12 at 20:51











  • I think my editor does not let me to use c#8 yet (I think because it is preview). Your updated answer is probably the closest I can get for now.

    – ilkerkaran
    May 12 at 20:54











Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f56103160%2fusing-is-operator-with-value-type-tuples-gives-error%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









17














Using C# 8's pattern matching capabilities, you can write this:



if (val is (int id, int name))

Console.WriteLine($"id: id; name: name");



However this boxes id and name, which is surprising. There's a proposal to optimize this.



Below C# 8, you can write this:



if (val is ValueTuple<int, int> pair)

Console.WriteLine($"id: pair.Item1; name: pair.Item2");



You can of course make it a bit clearer:



if (val is ValueTuple<int, int> pair)

var (id, name) = pair;
Console.WriteLine($"id: id; name: name");



It looks like you can also deconstruct the ValueTuple inline:



if (val is ValueTuple<int, int>(var id, var name))

Console.WriteLine($"id: id; name: name");



... which is somewhat horrific, but appears to be legal.



I might have expected val is (int, int) pair) to work, but it seems nobody's designed this case (yet).






share|improve this answer




















  • 1





    The first code block gives the same error. The second one works but I don't want to use Item1, Item2 etc.

    – ilkerkaran
    May 12 at 20:45











  • @ilkerkaran It works in sharplab - might be new in C# 8. sharplab.io/…

    – canton7
    May 12 at 20:47











  • @ilkerkaran found another way, added to my answer

    – canton7
    May 12 at 20:51











  • I think my editor does not let me to use c#8 yet (I think because it is preview). Your updated answer is probably the closest I can get for now.

    – ilkerkaran
    May 12 at 20:54















17














Using C# 8's pattern matching capabilities, you can write this:



if (val is (int id, int name))

Console.WriteLine($"id: id; name: name");



However this boxes id and name, which is surprising. There's a proposal to optimize this.



Below C# 8, you can write this:



if (val is ValueTuple<int, int> pair)

Console.WriteLine($"id: pair.Item1; name: pair.Item2");



You can of course make it a bit clearer:



if (val is ValueTuple<int, int> pair)

var (id, name) = pair;
Console.WriteLine($"id: id; name: name");



It looks like you can also deconstruct the ValueTuple inline:



if (val is ValueTuple<int, int>(var id, var name))

Console.WriteLine($"id: id; name: name");



... which is somewhat horrific, but appears to be legal.



I might have expected val is (int, int) pair) to work, but it seems nobody's designed this case (yet).






share|improve this answer




















  • 1





    The first code block gives the same error. The second one works but I don't want to use Item1, Item2 etc.

    – ilkerkaran
    May 12 at 20:45











  • @ilkerkaran It works in sharplab - might be new in C# 8. sharplab.io/…

    – canton7
    May 12 at 20:47











  • @ilkerkaran found another way, added to my answer

    – canton7
    May 12 at 20:51











  • I think my editor does not let me to use c#8 yet (I think because it is preview). Your updated answer is probably the closest I can get for now.

    – ilkerkaran
    May 12 at 20:54













17












17








17







Using C# 8's pattern matching capabilities, you can write this:



if (val is (int id, int name))

Console.WriteLine($"id: id; name: name");



However this boxes id and name, which is surprising. There's a proposal to optimize this.



Below C# 8, you can write this:



if (val is ValueTuple<int, int> pair)

Console.WriteLine($"id: pair.Item1; name: pair.Item2");



You can of course make it a bit clearer:



if (val is ValueTuple<int, int> pair)

var (id, name) = pair;
Console.WriteLine($"id: id; name: name");



It looks like you can also deconstruct the ValueTuple inline:



if (val is ValueTuple<int, int>(var id, var name))

Console.WriteLine($"id: id; name: name");



... which is somewhat horrific, but appears to be legal.



I might have expected val is (int, int) pair) to work, but it seems nobody's designed this case (yet).






share|improve this answer















Using C# 8's pattern matching capabilities, you can write this:



if (val is (int id, int name))

Console.WriteLine($"id: id; name: name");



However this boxes id and name, which is surprising. There's a proposal to optimize this.



Below C# 8, you can write this:



if (val is ValueTuple<int, int> pair)

Console.WriteLine($"id: pair.Item1; name: pair.Item2");



You can of course make it a bit clearer:



if (val is ValueTuple<int, int> pair)

var (id, name) = pair;
Console.WriteLine($"id: id; name: name");



It looks like you can also deconstruct the ValueTuple inline:



if (val is ValueTuple<int, int>(var id, var name))

Console.WriteLine($"id: id; name: name");



... which is somewhat horrific, but appears to be legal.



I might have expected val is (int, int) pair) to work, but it seems nobody's designed this case (yet).







share|improve this answer














share|improve this answer



share|improve this answer








edited 2 days ago

























answered May 12 at 20:39









canton7canton7

6,61211830




6,61211830







  • 1





    The first code block gives the same error. The second one works but I don't want to use Item1, Item2 etc.

    – ilkerkaran
    May 12 at 20:45











  • @ilkerkaran It works in sharplab - might be new in C# 8. sharplab.io/…

    – canton7
    May 12 at 20:47











  • @ilkerkaran found another way, added to my answer

    – canton7
    May 12 at 20:51











  • I think my editor does not let me to use c#8 yet (I think because it is preview). Your updated answer is probably the closest I can get for now.

    – ilkerkaran
    May 12 at 20:54












  • 1





    The first code block gives the same error. The second one works but I don't want to use Item1, Item2 etc.

    – ilkerkaran
    May 12 at 20:45











  • @ilkerkaran It works in sharplab - might be new in C# 8. sharplab.io/…

    – canton7
    May 12 at 20:47











  • @ilkerkaran found another way, added to my answer

    – canton7
    May 12 at 20:51











  • I think my editor does not let me to use c#8 yet (I think because it is preview). Your updated answer is probably the closest I can get for now.

    – ilkerkaran
    May 12 at 20:54







1




1





The first code block gives the same error. The second one works but I don't want to use Item1, Item2 etc.

– ilkerkaran
May 12 at 20:45





The first code block gives the same error. The second one works but I don't want to use Item1, Item2 etc.

– ilkerkaran
May 12 at 20:45













@ilkerkaran It works in sharplab - might be new in C# 8. sharplab.io/…

– canton7
May 12 at 20:47





@ilkerkaran It works in sharplab - might be new in C# 8. sharplab.io/…

– canton7
May 12 at 20:47













@ilkerkaran found another way, added to my answer

– canton7
May 12 at 20:51





@ilkerkaran found another way, added to my answer

– canton7
May 12 at 20:51













I think my editor does not let me to use c#8 yet (I think because it is preview). Your updated answer is probably the closest I can get for now.

– ilkerkaran
May 12 at 20:54





I think my editor does not let me to use c#8 yet (I think because it is preview). Your updated answer is probably the closest I can get for now.

– ilkerkaran
May 12 at 20:54



















draft saved

draft discarded
















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f56103160%2fusing-is-operator-with-value-type-tuples-gives-error%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Category:9 (number) SubcategoriesMedia in category "9 (number)"Navigation menuUpload mediaGND ID: 4485639-8Library of Congress authority ID: sh85091979ReasonatorScholiaStatistics

Circuit construction for execution of conditional statements using least significant bitHow are two different registers being used as “control”?How exactly is the stated composite state of the two registers being produced using the $R_zz$ controlled rotations?Efficiently performing controlled rotations in HHLWould this quantum algorithm implementation work?How to prepare a superposed states of odd integers from $1$ to $sqrtN$?Why is this implementation of the order finding algorithm not working?Circuit construction for Hamiltonian simulationHow can I invert the least significant bit of a certain term of a superposed state?Implementing an oracleImplementing a controlled sum operation

Magento 2 “No Payment Methods” in Admin New OrderHow to integrate Paypal Express Checkout with the Magento APIMagento 1.5 - Sales > Order > edit order and shipping methods disappearAuto Invoice Check/Money Order Payment methodAdd more simple payment methods?Shipping methods not showingWhat should I do to change payment methods if changing the configuration has no effects?1.9 - No Payment Methods showing upMy Payment Methods not Showing for downloadable/virtual product when checkout?Magento2 API to access internal payment methodHow to call an existing payment methods in the registration form?